桌面端表单类组件
桌面端提供两种表单样式:无边框表单和有边框表单,界面效果如下面两张图所示
- 无边框表单
- 有边框表单
快速布局
系统提供表单快速布局,提供快速生成表单、修改表单的能力。支持普通表单、卡片表单、分步表单、表格表单(有边框表单),如下图所示
- 普通表单
- 卡片表单
- 分步表单
- 表格表单
打开快速布局
选中“表单”组件,点击“快速布局”,如下图所示,打开快速布局配置页面
设置布局方式
空表单可以设置是否使用分步表单、卡片表单、表格表单,生成表单后不能再修改。 快速布局配置页面中有3个开关:使用分步表单、使用卡片、使用表格布局,如下图所示,选中表示使用,取消选中表示不使用
配置表单项
将页面上数据组件中的列添加为表单项,表单项配置如下
- 排序:通过拖拽排序图标,调整表单项的显示顺序
- 设置标签:“表单项名称”为空,标签显示列名,否则显示“表单项名称”中定义的内容
- 设置输入类组件:可选择输入框、长文本、选择器、单选组、多选组、开关、附件等组件
- 设置列宽:设置特殊列的列宽,例如占整行,设置为24。表单分为几列,可以在表单组件上设置,不用在这里设置
无边框表单
无边框表单使用:表单、行列、表单项等组件组成。页面结构如下图所示
源码如下
{% raw %}
<antdpro:Form id="form0" labelCol="{{"span":6}}" >
<antdpro:Row gutter="20" id="row0" >
<antdpro:Col id="col0" span="12" >
<antdpro:Form.Item id="formItem0" label="{restData0.label('name')}" />
</antdpro:Col>
<antdpro:Col id="col1" span="12" >
<antdpro:Form.Item id="formItem1" label="{restData0.label('firstClass')}" />
</antdpro:Col>
<antdpro:Col id="col2" span="24" >
<antdpro:Form.Item id="formItem2" label="{restData0.label('unit')}" />
</antdpro:Col>
</antdpro:Row>
</antdpro:Form>
{% endraw %}
表单组件
表单组件提供统一设置表单样式能力,包括
- 标签文本是否显示冒号
- 标签文本对齐方式:左对齐、右对齐
- 标签文本是否允许换行
- 标签和控件位置:
- 单独一行,标签在左侧
- 单独一行,标签在上面
- 和其他标签、控件连成一行
- 表单尺寸:大、中、小
- 标签布局:标签宽度(例如:160px)、栅格占位格数、左侧间隔格数、向左移动格数
- 控件布局:栅格占位格数、左侧间隔格数、flex 布局属性
只有一列内容的表单,可以不使用行列组件,在表单组件中直接放表单项组件。
行列组件
行列组件在表单中提供一行多列、及设置列宽的能力
- 一行显示一列、二列、三列、四列等
- 栅格一行总共24格,在列上设置不同栅格占位格数,实现不同的列宽
- 或者在列上设置 flex 布局属性,实现不同的列宽
表单项组件
表单项组件用来显示数据列的标签和控件(编辑器),提供下面几项能力:
- 继承表单组件中设置的样式,或者自定义样式
- 感知数据组件的规则设置
- 数据列设置为必填时,标签前面会显示红星
- 数据列内容验证失败时,显示提示信息(红色文字)
- 设置数据列的提示信息 tooltip 及图标
- 设置是否显示该数据列
有边框表单
有边框表单使用:表单、描述列表等组件组成。页面结构如下图所示
描述列表由一个个描述列表项组成,运行效果如下图所示
- 描述列表的“布局类型”属性分为:描述项和表单项,作为表单使用时,应该设置为表单项
- 表单项的样式跟随表单的设置,例如标签对齐方式,是否显示冒号等
- 表单项分为:标签、内容、后缀标签3个部分,下图中的“元”就是后缀标签
- 描述列表项使用栅格占位格数,占满一行为24
输入类组件
系统在页面上提供数据组件,和表单类组件绑定后,实现双向数据绑定
- 写入数据:用户录入,或通过代码赋值后,数据会写入数据组件的当前行
- 读取数据:表单类组件实时显示数据组件当前行的数据,数据改变后,会立即显示新的数据
输入类组件包括:输入框、文本框、密码框等组件,是最简单的表单类组件。它们通过设置“绑定数据列”属性绑定到一个数据组件的列上,从而实现双向数据绑定。
选择类组件
选择类组件包括:选择器、单选组、多选组等组件,通过设置“范围数据集”列出可选项,提供给用户选择。
特别说明
- “范围数据集”指定的数据组件和“绑定数据列”里面的数据组件不能是同一个数据组件
- 页面运行时,选择类组件在界面上显示“范围数据集”中“选择项名称”列里面的数据,提供给用户选择
- 用户选择后,选择类组件将“范围数据集”中“选择项值”列里面的数据,写入“绑定数据列”
- 如果组件有“绑定显示列”属性,将“选择项名称”列里面的数据,写入“绑定显示列”
- 选择器和多选组组件的“绑定数据列”和“范围数据集-选择项值”这两列都必须是“文本”类型的,不能是“数字”类型的;单选组没有这个限制
例如:“单位”单选组组件,界面上显示“单位字典”表中所有行“名称”列里面的值。用户选择后,将“名称”列里面的值写入到“商品”表的“单位”列中,配置如下图所示
例如:“一级分类”选择器组件,界面上显示“商品分类”表中所有行“分类名称”列里面的值。用户选择后,将“商品分类”表“主键”列里面的值写入到“商品”表的“一级分类”列中,将“分类名称”列里面的值写入到“商品”表的“商品分类.分类名称”列中,配置如下图所示
树选择和级联选择组件
上面介绍的选择类组件用于选择平板数据,对于树形数据使用树选择组件或级联选择组件
树选择组件
- 下拉数据以树形展示,如下图所示
- 用户选择后,存入选择数据本身的值
- 支持逐级加载数据,适合大量数据场景
树形数据如果有“全路径ID”列和“全路径名称”列,树选择组件支持服务端过滤,设置方法如下
- 设置树选择组件的范围数据集的“根展现方式”属性为“虚拟树”
- 设置树选择组件的“显示搜索框”属性为“是”
- 设置树选择组件的“搜索模式“属性为”服务端“
- 设置树选择组件的“过滤列”属性为名称列
运行效果如下图所示
级联选择组件
- 下拉数据从左到右依次逐级展开,如下图所示
- 用户选择后,存入选择数据的全路径的值
- 必须加载全部数据,不适合大量数据场景
级联选择组件支持前端过滤,运行效果如下图所示
日期选择类组件
日期选择类组件包括:日期选择、日期范围选择、时间选择、时间范围选择等组件,用于选择日期时间、日期、年、年月、时分秒等
- “日期选择”组件提供选择日期时间、日期、年、年月、季、周
- “时间选择”组件提供选择时分秒,可显示为时分秒、时分、分秒、时、分、秒
- “范围组件”提供两个日期时间的选择,且保证后一个日期时间大于前一个日期时间
特别注意
- 存日期的列,数据类型是日期
- 存日期时间的列,数据类型是日期时间
- 存不完整日期时间的列,数据类型必须是字符串
- 以上规则适用于动态数据集、静态数据集和自定义数据
各种选择形式的设置方法见下表
选择形式 | 使用组件 | 属性设置 |
---|---|---|
日期 | 日期选择组件 | |
日期时间 | 日期选择组件 | 显示时间 = 是 |
年 | 日期选择组件 | 类型 = 年 |
年月 | 日期选择组件 | 类型 = 月 |
时间 | 时间选择组件 | 时间格式 = HH:mm 可显示为时分 |
输入提示
“自动完成”组件提供输入提示能力,即边输入边用一个下拉框显示,用输入值过滤出来的数据。输入后,即可以将输入值写入某个数据列,也可以按输入值进行查询。
设置“提示数据列”属性为某个数据组件的某列,当“自动完成”组件的输入框中的值发生变化时,系统发送请求,查询“提示数据列”包括输入值的数据,将查询到的数据显示到下拉框中,作为提示信息。
搜索框
设置“展示效果”属性为“搜索”,并设置“搜索数据列”为某个数据组件的某列,用户回车或点击搜索按钮时,系统发送请求,查询“搜索数据列”包括输入值的数据,实现搜索框的能力,运行效果如下图所示
输入框
设置“展示效果”属性为“输入”,并设置“输入数据列”为某个数据组件的某列,用户输入后,系统将输入值写入“输入数据列”,实现输入框的能力
表单类组件
表单类组件提供很多属性用于界面展现和用户交互,鉴于官网介绍的比较详细,本文不再赘述。
注意:表单组件中输入类及选择类等组件事件,如值改变、回车输入等都是异步事件,因此在实际使用中要注意使用方法,例如在值变化事件下获取数据集当前行数据,是无法获取到新设置的值。要解决这个问题需要将相关逻辑放在“event.defaultActionPromise”中使用,例如:
let onInput0Change = (event) => {
/**
* 这是异步事件,修改的值不会立即同步到数据集,因此在这里调用获取数据集当前行无法获取到新变化值
*/
event.defaultActionPromise?.then(() => {
//这里获取到的数据,对应字段值就是新变化值
const currentRow=$page.comp("tableCustomData0").getCurrentRow();
//其他业务逻辑
})
}
组件 | 用途 | Antd 官网 | Antd Vue 官网 |
---|---|---|---|
表单 | 管理整个表单的样式 | 表单 | 表单 |
表单项 | 表单里面的一个单元格,由标签和控件组成 | 表单项 | 表单项 |
输入框 | 输入一行文本 | 输入框 | 输入框 |
长文本 | 输入多行文本 | 输入框 | 输入框 |
密码框 | 输入的内容显示为 * 号 | 输入框 | 输入框 |
自动完成 | 输入时显示提示的输入框、搜索框 | 自动完成 | 自动完成 |
选择器 | 下拉选择 | 选择器 | 选择器 |
树选择 | 下拉树型选择 | 树选择 | 树选择 |
级联选择 | 用于多层级数据的选择 | 级联选择 | 级联选择 |
滑动输入条 | 滑动输入条,用于在给定的范围内选择一个值 | 滑动输入条 | 滑动输入条 |
开关 | 切换两种状态,绑定数据列的数据类型必须是数字 | 开关 | 开关 |
多选框 | 切换两种状态,绑定数据列的数据类型没有要求 | 多选框 | 多选框 |
多选组 | 在多个选项中选中多个 | 多选框 | 多选框 |
单选组 | 在多个选项中选中一个 | 单选框 | 单选框 |
日期选择 | 输入或选择日期 | 日期选择框 | 日期选择框 |
日期范围选择 | 输入或选择两个日期 | 日期选择框 | 日期选择框 |
时间选择 | 输入或选择时间 | 时间选择框 | 时间选择框 |
时间范围选择 | 输入或选择两个时间 | 时间选择框 | 时间选择框 |
颜色选择器 | 选择颜色 | 颜色选择器 | |
富文本编辑 | 输入具有格式和样式的文本 | ||
描述列表 | 实现带边框的表单 | 描述列表 | 描述列表 |
使用案例
设置数值输入框显示格式
对数字进行格式化显示,例如显示金额时前面加上货币符号¥或者 $,显示千分位
存储的值如下:
运行时展示如下:
输入框组件绑定了数值或小数类型的字段后,提供“数值输入配置”或“小数输入配置”
在配置中提供“输入框展示值格式”和“转换数字的方式”设置
- 输入框展示值格式 formatter:指定输入框展示值的格式
- 转换数字的方式 parser:指定从 formatter 里转换回数字的方式,和 formatter 搭配使用
在“输入框展示值格式”中设置显示的格式,代码如下:
react 代码
inputNumber1FormatterFn = (value, info) => {
if(value){
return `$${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}else{
return "";
}
}
vue 代码
let inputNumber0FormatterFn = (value, info) => {
if(value){
return `$${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
}
在“转换数字的方式”中把数据转换为要存储的值,代码如下:
react 代码
inputNumber1ParserFn = (str) => {
if(str){
return str.replace(/\$\s?|(,*)/g, '');
}
}
vue 代码
let inputNumber0ParserFn = (str) => {
if(str){
return str.replace(/\$\s?|(,*)/g, '');
}
}
运行时展示如下:
日期选择-控制不可选日期或时间
“日期选择”组件提供“不可选日期”和“不可选时间”属性,用于控制某些日期和时间不能选择。日期和时间的不可选是分别控制的,控制日期不可选在“不可选日期”上设置,控制时间(时、分、秒)不可选在“不可选时间”上设置,通过在 js 代码中返回不可选的日期、时间进行控制。
例如,不能选择今天以前的日期。“不可选日期”属性的 js 代码如下:
datePicker0DisabledDateFn = (currentDate) => {
return currentDate && currentDate < new Date();
}
例如,只能选今天及往后三天的日期。“不可选日期”属性的 js 代码如下:
datePicker0DisabledDateFn = (currentDate) => {
return wx.Date.decrease(wx.Date.now(),0,wx.Date.UNIT_DAY)>currentDate || wx.Date.increase(wx.Date.now(),4,wx.Date.UNIT_DAY)<currentDate;
}
例如:小时不能选择1, 3, 5, 6,分钟不能选择3, 4,秒不能选择1, 2。“不可选时间”属性的 js 代码如下:
datePicker0DisabledTimeFn = (date) => {
return {
disabledHours: function() {
return [1, 3, 5, 6];
},
disabledMinutes: function() {
return [3, 4];
},
disabledSeconds: function(){
return [1, 2];//不需要设置的类型直接返回[]即可
}
}
}
运行效果如下,不可选的日期和时间以灰色显示
日期选择-自定义日期文案
“日期选择”组件提供“日期渲染”属性,实现自定义日期文案。在 js 代码中根据不同的日子返回不同的样式。
js 代码中使用了 react,因此需要引用 react,代码如下
import React from 'react';
日期渲染的 js 代码如下:
datePicker0DateRenderFn(currentDate,today){
let containerStyle = {
height: "35px",
width: "35px",
margin: "0 auto",
borderRadius: "50%",
fontSize: "12px",
border: "1px blue solid", // 边框
backgroundColor: "lightgray" // 背景色
};
let day1Style = {
height: "35px",
width: "35px",
margin: "0 auto",
borderRadius: "50%",
fontSize: "12px",
border: "1px red solid", // 边框
backgroundColor: "white" // 背景色
};
let todayStyle = {
height: "35px",
width: "35px",
margin: "0 auto",
borderRadius: "50%",
fontSize: "12px",
border: "1px yellow solid", // 边框
backgroundColor: "white" // 背景色
};
//设置文字居中
let dateMiddle = {
position: "relative",
top: "8px"
};
//和今天的日子一样用 todayStyle 样式,每月1日用 day1Style 样式,其它日子用 containerStyle 样式
if(currentDate.date() === today.date()){
return <div style={todayStyle}>
<div style={dateMiddle}>{currentDate.date()}</div>
</div>
}else if(currentDate.date() === 1){
return <div style={day1Style}>
<div style={dateMiddle}>{currentDate.date()}</div>
</div>
}else{
return (
<div style={containerStyle}>
<div style={dateMiddle}>{currentDate.date()}</div>
</div>
);
}
}
运行效果如下图所示
表单-缩小行距
系统默认在表单项中显示提示信息,如下图所示,导致表单行距比较大
通过设置样式实现不显示提示信息,以达到缩小行距的效果,如下图所示
在css文件中,增加下面的代码,即可实现上图的效果
:global{
.ant-form-item-with-help .ant-form-item-explain{ display:none; }
.ant-form-item-control-input{ min-height:33px; }
}
将上面代码中的33px调整为43px是下图的效果
设置富文本编辑器内容自适应
插件默认配置,可参考“$UI2\comp\antdpro\components\TinyMceEditor\TinyMceEditor.react.js”
//语言
this.languageIds = {
"zh-CN":"zh-Hans",
"zh-TW":"zh-Hant",
"en-US":"en-US",
}
//默认配置
getDefaultInit = () => {
return {
plugins:
'advlist autolink lists link image media charmap anchor table emoticons ' +
'preview searchreplace visualblocks code fullscreen ' +
'insertdatetime code wordcount'
,
automatic_uploads: true,
skin: false,
language: this.languageIds[this.getPage().getCurrentLanguage().languageId],
promotion: false,
branding: false,
content_css: false,
relative_urls: true,
font_family_formats: "宋体;方正小标宋=FZXiaoBiaoSong-B05S;仿宋=FangSong;微软雅黑=Microsoft Yahei;黑体;楷体",
toolbar:
'undo redo | fontfamily | styles |image | bold italic | ' +
' forecolor backcolor | alignleft aligncenter alignright alignjustify | ' +
'outdent indent | numlist bullist | ' +
'removeformat | emoticons | fullscreen | media | link | anchor | table | code | wordcount',
document_base_url: new URI(location.href).origin(),
content_style: contentUiCss.toString() + '\n' + contentCss.toString(),
}
}
富文本编辑器(TinyMceEditor)相关配置可参考官网。富文本编辑器默认没有引用自适应插件,因此在使用时,需要在组件上先行配置开启插件,再到对应的js中引入自适应插件,如下图所示:
案例位置
桌面-页面-列表表单组件-表单组件.w