Form 表单

大约 5 分钟

Form 表单

高性能表单控件,自带数据域管理。包含数据录入、校验以及对应样式。

何时使用

  • 用于创建一个实体或收集信息。
  • 需要对输入的数据类型进行校验时。

表单

我们为 form 提供了以下三种排列方式:

  • 水平排列:标签和表单控件水平排列;(默认)
  • 垂直排列:标签和表单控件上下垂直排列;
  • 行内排列:表单项水平行内排列。

表单域

表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。

代码演示

基本用法
基本用法。


表单布局
表单有三种布局。


嵌套结构与校验信息
name 属性支持嵌套数据结构。通过 validateMessages 或 message 自定义校验信息模板,模板内容可参考此处。


API

Form

参数说明类型默认值版本
colon配置 Form.Item 的 colon 的默认值 (只有在属性 layout 为 horizontal 时有效)booleantrue
hideRequiredMark隐藏所有表单项的必选标记Booleanfalse
labelAlignlabel 标签的文本对齐方式'left' | 'right''right'
labelCollabel 标签布局,同 <Col> 组件,设置 span offset 值,如 {span: 3, offset: 12}sm: {span: 3, offset: 12}object
labelWraplabel 标签的文本换行方式booleanfalse3.0
layout表单布局'horizontal'|'vertical'|'inline''horizontal'
model表单数据对象object
name表单名称,会作为表单字段 id 前缀使用string-2.0.0
noStyletrue 时不带样式,作为纯字段控件使用booleanfalse3.0
rules表单验证规则object
scrollToFirstError提交失败自动滚动到第一个错误字段boolean | optionsopen in new windowfalse2.0.0
validateOnRuleChange是否在 rules 属性改变后立即触发一次验证booleantrue
validateTrigger统一设置字段校验规则string | string[]change2.0.0
wrapperCol需要为输入控件设置布局样式时,使用该属性,用法同 labelColobject

事件

事件名称说明回调参数版本
finish提交表单且数据验证成功后回调事件function(values)-2.0.0
finishFailed提交表单且数据验证失败后回调事件function({ values, errorFields, outOfDate })-2.0.0
submit数据验证成功后回调事件Function(e:Event)
validate任一表单项被校验后触发Function(name, status, errorMsgs)

方法

方法名说明参数版本
clearValidate移除表单项的校验结果。传入待移除的表单项的 name 属性或者 name 组成的数组,如不传则移除整个表单的校验结果(nameList?: NamePath[]) => void
resetFields对整个表单进行重置,将所有字段值重置为初始值并移除校验结果(nameList?: NamePath[]) => void
scrollToField滚动到对应字段位置(name: NamePath, options: [ScrollOptionsopen in new window]) => void
validate触发表单验证, 同 validateFields(nameList?: NamePath[]) => Promise
validateFields触发表单验证(nameList?: NamePath[]) => Promise

NamePath

string | number | (string | number)[]

Form.Item

参数说明类型默认值版本
autoLink是否自动关联表单域,对于大部分情况都可以使用自动关联,如果不满足自动关联的条件,可以手动关联,参见下方注意事项booleantrue
colon配合 label 属性使用,表示是否显示 label 后面的冒号booleantrue
extra额外的提示信息,和 help 类似,当需要错误信息和提示文案同时出现时,可以使用这个。string|slot
hasFeedback配合 validateStatus 属性使用,展示校验状态图标,建议只配合 Input 组件使用booleanfalse
help提示信息,如不设置,则会根据校验规则自动生成string|slot
htmlFor设置子元素 label htmlFor 属性string
labellabel 标签的文本string|slot
labelAlign标签文本对齐方式'left' | 'right''right'
labelCollabel 标签布局,同 <Col> 组件,设置 span offset 值,如 {span: 3, offset: 12}sm: {span: 3, offset: 12}object
name表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的string
required是否必填,如不设置,则会根据校验规则自动生成booleanfalse
rules表单验证规则object | array
validateFirst当某一规则校验不通过时,是否停止剩下的规则的校验。booleanfalse2.0.0
validateStatus校验状态,如不设置,则会根据校验规则自动生成,可选:'success' 'warning' 'error' 'validating'string
validateTrigger设置字段校验的时机string | string[]change2.0.0
wrapperCol需要为输入控件设置布局样式时,使用该属性,用法同 labelColobject

注意:

3.x

自 3.0 版本以后,Form.Item 不再劫持子元素,而是通过 provider / inject 依赖注入的方式进行自动校验,这种方式可以提高组件性能,子元素也不会限制个数,同样子元素也可以是进一步封装的高级组件。

但它同样会有一些缺点:

1、自定义组件如果希望 Form.Item 进行校验展示,你需要 const {id, onFieldChange, onFieldBlur} = useInjectFormItemContext() 注入,并调用相应的方法。

2、一个 Form.Item 只能收集一个表单项的数据,如果有多个表单项,会导致收集错乱,例如,

<a-form-item>
  <a-input name="a"></a-input>
  <a-input name="b"></a-input>
</a-form-item>

如上 Form.Item 并不知道需要收集 name="a" 还是 name="b",你可以通过如下三种方式去解决此类问题:

第一种,使用多个 a-form-item:

<a-form-item>
  <a-input name="a"></a-input>
  <a-form-item><a-input name="b"></a-input></a-form-item>
</a-form-item>

第二种,使用自定义组件包裹,并在自定义组件中调用 useInjectFormItemContext,相当于把多个表单项合并成了一个

<script>
  // 自定义组件
  import { Form } from 'ant-design-vue';
  export default {
    setup() {
      const formItemContext = Form.useInjectFormItemContext();
    },
  };
</script>
<a-form-item>
  <custom-com>
    <a-input name="a"></a-input>
    <a-input name="b"></a-input>
  </custom-com>
</a-form-item>

第三种,组件库提供了一个 a-form-item-rest 组件,它会阻止数据的收集,你可以将不需要收集校验的表单项放到这个组件中即可,它和第一种方式很类似,但它不会产生额外的 dom 节点。

<a-form-item>
  <a-input name="a"></a-input>
  <a-form-item-rest><a-input name="b"></a-input></a-form-item-rest>
</a-form-item>
上次编辑于:
贡献者: Noah.Su,Xiou.Wang