# Form 表单 用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型,常见的 form 表单为`单元格`形式的展示,即左侧为表单的标题描述,右侧为表单的输入。 其中,`Input 输入框`、`Textarea 输入框`、`Picker 选择器`、 `Calendar 日历选择器`、 `ColPicker 多列选择器`、`SelectPicker 单复选选择器`、`Cell 单元格` 和 `DatetimePicker 日期时间选择器`具有`单元格`的展示形式,同时也支持 `prop` 和 `rules` 属性,我们称之为`表单项组件`,而 `InputNumber 计数器` 、 `Switch 开关` 和 `Upload 上传` 等组件则需要使用 `Cell 单元格` 进行包裹使用。 结合 `wd-form` 组件,可以实现对以上组件的规则校验。 > 对于表单组件,建议对 wd-cell-group 开启 border 属性,这样每条 cell 就会有边框线隔离开,这样表单的划分比较清晰。 ## 基础用法 在表单中,使用 `model` 指定表单数据对象,每个 `表单项组件` 代表一个表单项,使用 `prop` 指定表单项字段 ,使用 `rules` 属性定义校验规则。 ::: details 查看基础用法示例 ::: code-group ```html [vue] 提交 ``` ```typescript [typescript] ``` ```css [css] .footer { padding: 12px; } ``` ::: ## 校验错误提示方式 1. `message`:默认为输入框下方用文字进行提示 2. `toast`:以"toast"提示的方式弹出错误信息,每次只弹出最前面的那个表单域的错误信息 3. `none`:不会进行任何提示 ::: details 错误提示方式 ::: code-group ```html [vue] 提交 ``` ```typescript [typescript] ``` ::: ## 校验规则 本章节演示四种自定义校验及提示规则:`正则校验`、`函数校验`、`函数返回错误提示`和`异步函数校验`。 ::: details 查看校验规则示例 ::: code-group ```html [vue] 提交 ``` ```typescript [typescript] ``` ```css [css] .footer { padding: 12px; } ``` ::: ## 动态表单 表单项动态增减。 ::: details 查看动态表单示例 ::: code-group ```html [vue] 添加 删除 重置 提交 ``` ```typescript [typescript] ``` ```css [css] .footer { text-align: left; :deep(.wd-button) { &:not(:last-child) { margin-right: 12px; } } } ``` ::: ## 指定字段校验 `validate` 方法可以传入一个 `prop` 参数,指定校验的字段,可以实现在表单组件的`blur`、`change`等事件触发时对该字段的校验。`prop` 参数也可以是一个字段数组,指定多个字段进行校验。 ::: details 查看指定字段校验示例 ::: code-group ```html [vue] 提交 校验用户名和密码 ``` ```typescript [typescript] ``` ```css [css] .footer { padding: 12px; } ``` ::: ## 不对隐藏组件做校验 1.6.0 在表单中,如果某个组件使用 `v-if` 隐藏,则不会对该组件进行校验。 ## 复杂表单 结合`Input 输入框`、`Textarea 输入框`、`Picker 选择器`、 `Calendar 日历选择器`、 `ColPicker 多列选择器`、`SelectPicker 单复选选择器`、`Cell 单元格` 和 `DatetimePicker 日期时间选择器`实现一个复杂表单。 ::: details 查看复杂表单示例 ::: code-group ```html [vue] 已阅读并同意 《巴拉巴拉吧啦协议》 提交 ``` ```typescript [typescript] ``` ```css [css] .inline-txt { display: inline-block; font-size: 14px; margin: 0 8px; color: rgba(0, 0, 0, 0.45); vertical-align: middle; } :deep(.group) { margin-top: 12px; } .tip { margin: 10px 15px 21px; color: #999; font-size: 12px; } .footer { padding: 0 25px 21px; } :deep(.label-class) { color: #999 !important; font-size: 12px !important; } ``` ::: ## Attributes | 参数 | 说明 | 类型 | 可选值 | 默认值 | 最低版本 | | ------------- | ----------------------------------------------------------------------------------- | --------------------- | ------ | --------- | ---------------- | | model | 表单数据对象 | `Record` | - | - | 0.2.0 | | rules | 表单验证规则 | `FormRules` | - | - | 0.2.0 | | resetOnChange | 表单数据变化时是否重置表单提示信息(设置为 false 时需要开发者单独对变更项进行校验) | `boolean` | - | `true` | 0.2.16 | | errorType | 校验错误提示方式 | `toast/message/none` | - | `message` | 1.3.8 | ### FormItemRule 数据结构 | 键名 | 说明 | 类型 | | --------- | ------------------------------------------------------- | ------------------------------------- | | required | 是否为必选字段 | `boolean` | | message | 错误提示文案 | `string` | | validator | 通过函数进行校验,可以返回一个 `Promise` 来进行异步校验 | `(value, rule) => boolean \| Promise` | | pattern | 通过正则表达式进行校验,正则无法匹配表示校验不通过 | `RegExp` | ## Events | 事件名称 | 说明 | 参数 | 最低版本 | | -------- | ------------------------------------------------------------------------------ | --------------- | -------- | | validate | 验证表单,支持传入一个 prop 来验证单个表单项,不传入 prop 时,会验证所有表单项,1.6.0 版本起支持传入数组 | `prop?: string\|string[]` | 0.2.0 | | reset | 重置校验结果 | - | 0.2.0 | ## 外部样式类 | 类名 | 说明 | 最低版本 | | ------------ | ---------- | -------- | | custom-class | 根节点样式 | 0.2.0 |