桌面端布局类组件

在页面上通过拖放不同的布局组件,可以形成多种布局效果,下面介绍常见的几种布局方式

布局方式

流式布局

系统默认的布局方式,不需要专门的布局组件,超出一屏后,自动出现滚动条,如下图所示

多列布局

页面中的内容多列排布,整体页面还是流式布局,即超出一屏后,自动出现滚动条。

实现方法:

  • 使用行列组件,保留两列
  • 设置每列的 flex 布局属性或栅格占位格数
  • 通过 flex 表示列宽比例
  • 栅格占位格数的合计超过24会另起一行

充满布局

和前面两种流式布局不同,页面不会出现滚动条,在需要滚动的区域出现滚动条。系统提供“弹性布局”组件实现充满布局,如下图所示

系统提供“分割面板”,实现左右分栏,中间的分割线支持左右拖动,改变左右分栏的宽度。分割面板将页面分为左右两个部分,两个部分可以支持各自的布局方式,通常左边采用充满布局,右边采用流式布局或充满布局。如下图所示

实现充满布局

页面组件设置

页面 page 组件设置“自动充满”属性为“是”,表示页面高度自动充满

弹性布局组件设置

弹性布局组件的属性设置如下

  • “主轴方向垂直”属性选择“是”,表示弹性布局组件中的组件垂直排列
  • "自动充满模式"属性选择"第二个元素充满",如下图所示,弹性布局组件中共有3个元素,分别是工具栏、表格和分页,表格就是第二个元素,这样设置后表格的高度会自动充满
  • “间隙”属性选择“中”,表示每两个元素垂直方向上有16 px 的间距

表格组件设置

表格组件设置“纵向滚动高度”属性,实现表头固定效果。弹性布局组件提供 css 变量 --flex-auto-fill-size 表示自动充满区域的高度(主轴方向垂直时),用这个高度减去表格的表头高度、总结栏高度等,就是表格纵向滚动高度。例如默认大小的表格的表头高度是55 px,表格的纵向滚动高度为:

calc(var(--flex-auto-fill-size) - 55px)

设置表格的“纵向滚动高度”属性,如下图所示,注意字符串需要使用双引号括起来

实现左右分栏的充满布局

实现充满布局的方法和前面介绍的一样,只是在页面上先添加“分割面板”组件,在两个分割面板项中再添加“弹性布局”组件。

分割面板项的“高度样式”设置为充满,如下图所示

特别说明

  • React 两个分割面板项的初始尺寸写宽度比例,例如左分割面板项的初始尺寸为1,右分割面板项的初始尺寸为2,实现左右宽度1:2的效果
  • Vue 分割面板项的初始尺寸写百分数,例如33,另一个分割面板项的初始尺寸为空,实现左右宽度33:67的效果
  • Antd 组件默认为流式布局,即组件的高度是由内部组件的高度撑出来的,设置 height:100% 也不起作用,弹性布局组件放在这种组件中也会失效

上面案例中使用了样式设置页面白色背景以及内边距,样式参考如下

    .css-glamorous-div--jgd0xx>div:first-child,//分割面板左分栏
    .css-glamorous-div--jgd0xx>div:last-child,//分割面板右分栏
    {
        background-color: var(--ant-color-bg-base);
        padding: 20px 24px;
    }

实现左充满右流式的布局

整个页面撑满,分为左右两部分。左边充满,右边超出一屏时滚动,如下图所示

上图右边出现滚动条,滚动后,只滚动右边,左边不滚动,滚动后效果如下图所示

实现方法:

  • 设置页面组件的“自动充满”属性为是,实现整个页面撑满的效果
  • 使用分割面板组件将页面分成左右两部分
  • 左边分割面板项,设置“高度样式”为“充满”,添加弹性布局组件实现左边充满
  • 右边分割面板项,设置“高度样式”为“滚动充满”

响应式布局

页面内容的在不同屏幕分辨率下,呈现出不同的排布。如下面两张图所示,不同的屏幕大小,一行显示的内容不同。注意这不是固定宽度后的水平流式布局,这是使用栅格系统,为6种屏幕大小设置的排布规则。

6种屏幕大小分别是:超小屏<576px、小屏>=576px、中屏>=768px、大屏>=992px、超大屏>=1200px、无限大屏>=1600px

使用行列组件实现响应式布局:

  • 设置每列的不同屏幕大小下的“栅格占位格数”,如下图所示
  • 不同的列可以设置不同的栅格占位格数,即列宽可以不同
  • 一行的栅格格数是24,超过24后,另起一行排列
  • 由于24除不尽5,不能均匀的显示5列

使用列表组件实现响应式布局:

  • 在列表组件上设置“列表栅格配置”,如下图所示
  • 列表中的每列宽度相同
  • 不受24栅格的影响,列数支持任意整数

行列

行列组件用于实现一行多列,支持栅格布局和 flex 布局,运行效果如下图所示

行列组件支持

  • 设置列之间的水平间距和垂直间距
  • 设置列的响应式布局

如上图所示,一行分为4列,列之间有水平间距,当在小屏幕上显示时,一行显示两列,显示两行,这时有垂直间距。在行上设置间隔,包括水平间距和垂直间距,如下图所示

在列上设置响应式布局,如下图所示,栅格占位格数为24表示占满一行,不同的屏幕大小,设置不同的栅格占位格数,就是响应式布局

卡片

卡片组件用来提供背景色、内边距、标题和标题右侧扩展区域。卡片组件不设置标题,就不显示标题区。设置卡片的标题和右侧扩展区域的界面如下图所示

描述卡片

描述卡片提供一种支持头像、标题和描述信息的卡片,如下图所示

1737104676007

设计时,在卡片上点击添加描述卡片,如下图所示

1737104859575

在描述卡片上添加头像、描述内容和标题,如下图所示

1737104894017

描述列表

描述列表用于展示多个只读字段的组合。包括至少一个描述列表项,一个描述列表项包括一个标签和一个内容,可以左右显示,如下图所示,也可以上下显示

1737105970042

上图对应的页面结构如下图所示,标签里面放一个图片,描述列表项中的节点即为内容

1737106053410

对应的 w 源码如下

<antdpro:Descriptions bordered="true" column="1" id="descriptions0" labelStyle="width:100px;">
    <antdpro:Descriptions.Item id="descriptionsItem0" xmlns:antdpro="$UI/comp/antdpro/components">
        <attr:label d_canAddChild="true" id="default41" xmlns:attr="http://www.wex5.com/attr">
            <antdpro:Image height="80" id="image1" src="$UI/pcx/images/online1.png" width="80">
            </antdpro:Image>
        </attr:label>
        <antdpro:Div id="div4">
            <antdpro:Typography.Text id="typographyText8" text="正确数量条数:">
            </antdpro:Typography.Text>
            <antdpro:Typography.Text id="typographyText25" text="{pageData.current?.rightNum + "条"}" type="success">
            </antdpro:Typography.Text>
        </antdpro:Div>
        <antdpro:Div id="div5">
            <antdpro:Typography.Text id="typographyText9" text="异常数量条数:">
            </antdpro:Typography.Text>
            <antdpro:Typography.Text id="typographyText21" text="{pageData.current?.errorNum + "条"}" type="danger">
            </antdpro:Typography.Text>
        </antdpro:Div>
    </antdpro:Descriptions.Item>
</antdpro:Descriptions>

标签页

标签页组件提供显示多张选项卡以及互相切换的功能。包括标签栏、内容区和扩展区。标签页绑定数据集后实现动态标签页效果。

水平标签页

  • “位置”属性设置为上(下),标签栏就显示在上(下)侧,实现水平标签页。
  • “居中”属性设置为是,标签栏显示在中间。
  • “类型”属性设置为卡片,标签栏显示为卡片样式,设计界面如下图所示

垂直标签页

“位置”属性设置为左(右),标签栏就显示在左(右)侧,实现垂直标签页

动态标签页

动态添加、删除标签页,运行效果如下图所示

动态添加标签页,添加标签栏容易,添加复杂的内容困难,因此动态添加的标签页通常用作展示相同的内容,只是其中的数据不同。本例动态添加的是商品分类页签,切换商品分类页签,刷新商品列表,显示不同商品分类下的商品。

准备标签页数据

添加一个自定义数据,作为标签页数据。添加键、标题、可关闭三列,如下图所示

在标签页数据中,添加固定页签的数据,如下图所示

标签页设置列表

在标签页组件上设置列表

列表绑定“标签页数据”

在“标签项”上,将键、标题、关闭等属性绑定“标签页数据”的对应列

设置标签页

标签页属性设置如下

  • type:必须,设置标签页为可编辑的卡片风格 editable-card
  • hideAdd:隐藏添加按钮
  • onChange:切换选项卡时触发,在这个事件中获取当前选项卡的 key 值,可用于过滤数据
  • onEdit:删除标签页时触发,在这个事件中从标签页数据中删除指定标签栏的数据,删除后调用 setActiveTab 方法重新指定激活页

切换选项卡时,存储 activeKey 用于控制选项卡内容是否显示,也用 activeKey 作为过滤条件,获取对应的数据,代码如下:

    onTabs1Change = ({ activeKey }) => {
        this.comp("pageData").setValue("activeKey", activeKey);
        this.comp("productData").refreshData();
    }

固定页签的选项卡的内容放在不同的区块 div 中,每个区块通过“动态隐藏”属性 bind:hidden 控制何时显示,例如当前选项卡的 key 值等于 aa 时,显示 div0 这个区块,源码如下:

    <antdpro:Div bind:hidden="wx.Util.iif(pageData.current?.activeKey=="aa",false,true)" id="div0" >
        <antdpro:Button id="button0" text="按钮" >
        </antdpro:Button>
    </antdpro:Div>

添加选项卡就是给“标签页数据”增加数据,增加数据后,页签自动增加,示例代码如下:

    onAddTabBtnClick = ({row}) => async (event) => {
        await this.comp("tabsData").newData({defaultValues:[{
            "key":row.fid,
            "label":row.name
        }]});
    }

删除选项卡就是删除“标签页数据”中的数据,删除数据后,页签自动删除。注意一定要调用 event.preventDefault(); 方法取消组件的默认行为,还需通过 setActiveTab 方法指定激活页,示例代码如下:

    onTabs1Edit = (event) => {
        let {detail:{action, targetKey}} = event;
        if (action === 'remove') {
            this.comp("tabsData").deleteData(targetKey,{confirm:false});
        }
        event.preventDefault();//取消默认行为
        this.comp("tabs1").setActiveTab({activeKey:"bb"});//切换到固定二
    }

自定义标签

标签页组件的标签允许定制,运行效果如下图所示

上图中的“转化率”(文本、进度条)通过定制标题实现,选中标签项,定制标题,设计界面如下图所示

在标题里放行列、文本、进度条组件,如下图所示

组件属性

隐藏时渲染

打开页面时默认只渲染激活的标签项,其它标签项在被激活时渲染,标签项未渲染时,其中的组件未创建,不能访问。标签项提供“隐藏时渲染”属性,设置为 true,打开页面时会渲染该标签项,并创建其中的组件。

组件方法

激活标签项

组件提供 setActiveTab 方法激活标签项

方法:
    setActiveTab(JSON activeKey)
参数:
    {
        activeKey:标签项的键,如下图所示
    }

1727408356158

示例代码如下:

react 代码

this.comp("tabs0").setActiveTab({"activeKey":"tabsTabPane1"});

vue 代码

$page.comp("tabs0").setActiveTab({"activeKey":"tabsTabPane1"});

分割面板

分割面板组件用于切分指定区域,支持垂直切分、水平切分,支持组件嵌套,支持拖拽分割线,运行效果如下图所示

1741146591251

react 组件属性

分割面板组件由分割面板项组件组成,它们有各自的属性

组件 属性 说明
分割面板 分割模式 垂直:分割成左右区域;水平:分割成上下区域
添加面板项 默认一条分割线,分成两个区域,支持多条分割线,分成多个区域
分割面板项 初始尺寸 设置为数值,表示页面显示时区域的宽度占比
最小尺寸 设置为百分比,拖拽时区域的最小宽度
最大尺寸 设置为百分比,拖拽时区域的最大宽度
高度样式 默认:高度由内容决定,内容超出高度,不显示滚动条;
充满:高度自动充满,内容超出高度,不显示滚动条;
滚动充满:高度自动充满,内容超出高度,显示滚动条

react 分割面板组件使用 react-split-pane 组件,详情参考 https://github.com/tomkp/react-split-pane

vue 组件属性

分割面板组件由分割面板项组件组成,它们有各自的属性

组件 属性 说明
分割面板 水平 否:分割成左右区域;是:分割成上下区域
添加面板项 默认一条分割线,分成两个区域,支持多条分割线,分成多个区域
分割面板项 初始尺寸 设置为百分比,页面显示时区域的宽度
最小尺寸 设置为百分比,拖拽时区域的最小宽度
最大尺寸 设置为百分比,拖拽时区域的最大宽度
高度样式 默认:高度由内容决定,内容超出高度,不显示滚动条;
充满:高度自动充满,内容超出高度,不显示滚动条;
滚动充满:高度自动充满,内容超出高度,显示滚动条

vue 分割面板组件使用 splitpanes 组件,详情参考 https://gitcode.com/gh_mirrors/sp/splitpanes

固钉

固钉组件用于将页面元素钉在可视范围。与 CSS 中 position: sticky 属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部或底部。也支持固定在局部区域内,运行效果如下图所示

1733298489886

组件属性说明如下

  • 顶部偏移量:设置距离顶部的距离,如果没有设置底部偏移量,会固定在顶部
  • 底部偏移量:设置距离底部的距离,设置后固定在底部
  • 滚动目标元素:固定在目标元素内

1733300512909

固定在目标元素内

1733300556400

  • react 做法

在 w 文件中,使用 div 元素作为目标元素,增加 ref 属性,将 js 中创建的 ref 对象与 DOM 元素关联,代码如下

<div id="div1" ref="{$page.divRef}" style="overflow:scroll;height:300px;background-color:rgba(248,231,28,0.22);">
    <antdpro:Affix id="affix2" target="{$page.affix2TargetFn()}">
        <antdpro:Button id="button2" text="局部区域固定在顶部" xmlns:antdpro="$UI/comp/antdpro/components"/>
    </antdpro:Affix>
    <antdpro:Div id="div2" style="height:500px;background-color:rgba(248,231,28);">
    </antdpro:Div>
</div>

在 js 文件的构造函数中,使用 createRef() 方法创建一个 ref 对象,通过 ref 对象的 current 属性,可以访问到关联的 DOM 元素,代码如下

import Page from "$UI/wxsys/comps/reactContainer/page/Page";
import {createRef} from "react";
export default class IndexPage extends Page {
    constructor(props, context) {
        super(props, context);
        this.divRef = createRef();
    }

    affix2TargetFn = () => {
        return this.divRef.current;
    }
}
  • vue 做法

在 w 文件中,使用 div 元素作为目标元素,增加 ref 属性,将 js 中创建的 ref 对象与 DOM 元素关联,代码如下

<div id="div1" ref="{divRef}" style="overflow:scroll;height:300px;background-color:rgba(248,231,28,0.22);">
    <antdv:Affix id="affix2" target="{affix2TargetFn()}">
        <antdv:Button id="button2" text="局部区域固定在顶部">
        </antdv:Button>
    </antdv:Affix>
    <antdv:Div id="div2" style="height:500px;background-color:rgba(248,231,28);">
    </antdv:Div>
</div>

在 js 文件中,使用 ref() 方法创建一个 ref 对象,通过 ref 对象的 value 属性,可以访问到关联的 DOM 元素,代码如下

import { reactive, ref, watch } from "vue";
import { usePage, useData } from "vue_addon/core";
let $page = usePage();
let divRef = ref();

let affix2TargetFn = () => {
    return divRef.value;
}

锚点

锚点组件用于跳转到页面指定位置,运行效果如下图所示

1733302239783

在锚点组件中添加链接,在锚点链接中还可以再添加链接,形成树形结构

1733302566257

锚点链接属性说明如下

  • 文本:链接显示的文本
  • 链接:点击链接跳转的位置,使用 #id 跳转到当前页面的指定位置

1733302395836

上图中 #plumDiv 指的是 id 为 plumDiv 的组件

1733302460609

布局组件

系统提供的布局组件如下表所示,其中高级卡片、高级卡片组、多选卡片和多选卡片组只在 React 桌面端里。

组件 用途 Antd 官网 Antd Vue 官网
弹性布局 用于对齐的弹性布局容器 弹性布局 弹性布局
间距 设置组件之间的间距,避免组件紧贴在一起,拉开统一的空间 间距 间距
区块 作为其它组件的容器,组织页面结构 对应 Html 里面的 div
行列 实现一行多列,支持栅格布局和flex布局 Grid栅格 Grid栅格
卡片 最基础的卡片容器,可承载文字、列表、图片、段落 卡片 卡片
标签页 选项卡切换组件 标签页 标签页
步骤条 引导用户按照流程完成任务的导航条 步骤条 步骤条
折叠面板 可以折叠/展开的内容区域 折叠面板 折叠面板
固钉 将页面元素钉在可视范围 固钉 固钉
锚点 用于跳转到页面指定位置 锚点 锚点
高级卡片 页内容器卡片,提供标准卡片样式,卡片切分以及栅格布局能力 高级卡片
高级卡片组 属性同高级卡片,取消卡片内容边距,用于将多个卡片进行分组
多选卡片 集合多种相关联说明信息,并且可被选择的卡片 多选卡片
多选卡片组 多选卡片组内嵌多选卡片,并与栅格组件一起使用,实现更灵活的布局
布局 协助进行页面级整体布局 布局 布局
描述列表 展示多个只读字段的组合 描述列表 描述列表

案例位置

桌面-页面-页面布局-*.w

results matching ""

    No results matching ""