表单
表单包含 input、radio、select、checkbox 等。 使用表单,您可以收集、验证和提交数据。
提示
该组件已升级为 flex 布局,以取代旧的 float 布局。
典型表单
包括各种输入项,如 input、select、radio 和 checkbox。
在每一个 form 组件中,您需要一个 form-item 字段作为输入项的容器。
提示
W3C 规定:
当表单中只有一个单行文本输入字段时,用户代理(浏览器)应当将该字段中的回车键接受为提交表单的请求。
为了防止这种行为,您可以在 <el-form> 上添加 @submit.prevent。
行内表单
当垂直空间有限且表单相对简单时,您可以将其放在一行中。
设置 inline 属性为 true,表单将变为行内布局。
对齐方式
根据您的设计,有几种不同的方式来对齐您的标签元素。
您可以单独设置 el-form-item 的 label-position 2.7.7。如果值为空,则使用 el-form 的 label-position。
label-position 属性决定标签如何对齐,可以是 top 或 left。当设置为 top 时,标签将放置在表单字段的顶部。
表单校验
表单组件允许您验证数据,帮助您发现并纠正错误。
只需为 Form 组件添加 rules 属性,传递校验规则,并将 FormItem 的 prop 属性设置为需要校验的具体键。 更多信息请查看 async-validator
自定义校验规则
本例展示了如何自定义校验规则来完成二次密码确认。
这里我们使用 status-icon 来将校验结果以图标形式展示。
提示
必须调用自定义验证回调函数。 更多高级用法请查看 async-validator。
动态增删表单项
除了在表单组件上一次性传递所有校验规则外,您还可以动态地为单个表单字段传递校验规则或删除规则。
数字类型校验
数字类型校验需要在 input 的 v-model 绑定上添加 .number 修饰符,它用于将 Vue 提供的字符串值转换为数字。
提示
当一个 el-form-item 嵌套在另一个 el-form-item 中时,其标签宽度将为 0。如果需要,您可以在该 el-form-item 上设置 label-width。
表单内组件尺寸控制
表单中的所有组件都从该表单继承 size 属性。类似地,FormItem 也有 size 属性。
如果您不希望该组件从 Form 或 FormItem 继承其尺寸,您仍然可以微调每个组件的 size。
无障碍
当 el-form-item 内部只有一个输入框(或相关的控件,如选择器或多选框)时,表单项的标签将自动绑定到该输入框。 但是,如果 el-form-item 内部有多个输入框,则该表单项将被分配 WAI-ARIA 的 group 角色。 在这种情况下,您有责任为每个输入框分配辅助标签。
表单 API
表单属性
| 名称 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| model | 表单数据对象。 | object | — |
| rules | 表单验证规则。 | object | — |
| inline | 是否为行内表单模式。 | boolean | false |
| label-position | 表单域标签的位置。 如果设置为 'left' 或 'right',则 label-width 属性也是必需的。 | 枚举 | 右侧 |
| label-width | 表单域标签的宽度,例如 '50px'。 所有直接子表单项都将继承该值。 支持 auto。 | string / number | '' |
| label-suffix | 表单域标签的后缀。 | string | '' |
| hide-required-asterisk | 是否隐藏必填字段标签旁边的红色星号(星号)。 | boolean | false |
| require-asterisk-position | 星号的位置。 | 枚举 | left |
| show-message | 是否显示校验错误信息。 | boolean | true |
| inline-message | 是否以行内形式展示校验错误信息。 | boolean | false |
| status-icon | 是否在输入框中显示校验结果图标。 | boolean | false |
| validate-on-rule-change | 是否在 rules 属性改变后立即触发一次验证。 | boolean | true |
| size | 用于控制该表单内组件的尺寸。 | 枚举 | — |
| disabled | 是否禁用该表单内的所有组件。 在 2.12.0 之前,如果设置为 true,它将覆盖内部组件的 disabled 属性。 2.12.0 之后,内部组件的配置优先。 | boolean | false |
| scroll-to-error | 当校验失败时,滚动到第一个错误表单项。 | boolean | false |
| scroll-into-view-options 2.3.2 | 当校验失败时,根据 scrollIntoView 选项滚动到第一个错误表单项。 scrollIntoView。 | object / boolean | true |
表单事件
| 名称 | 描述 | 类型 |
|---|---|---|
| validate | 任一表单项被校验后触发 | Function |
表单插槽
| 名称 | 描述 | 子标签 |
|---|---|---|
| default | 自定义默认内容 | 表单项 (FormItem) |
表单公开方法
| 名称 | 描述 | 类型 |
|---|---|---|
| validate | 对整个表单的内容进行校验。 接收一个回调函数或返回 Promise。 | Function |
| validateField | 验证具体的表单项。 | Function |
| resetFields | 重置指定的字段并移除校验结果。 | Function |
| scrollToField | 滚动到指定的字段。 | Function |
| clearValidate | 清理所有或指定的表单项的校验信息。 | Function |
| fields 2.7.3 | 获取所有字段上下文。 | array |
| getField 2.10.2 | 获取一个字段上下文。 | Function |
| setInitialValues 2.13.1 | 设置表单字段的初始值。 当调用 resetFields 时,字段将重置为这些值。 | Function |
表单项 API
表单项属性
| 名称 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| prop | model 的键名。 它可以是一个属性路径(例如 a.b.0 或 ['a', 'b', '0'])。 在使用 validate、resetFields 方法时,该属性是必填的。 | string / string[] | — |
| label | 标签文本。 | string | — |
| label-position 2.7.7 | 表单项标签的位置。 如果设置为 'left' 或 'right',则 label-width 也是必需的。 默认继承 form 的 label-position。 | 枚举 | '' |
| label-width | 表单域标签的宽度,例如 '50px'。 支持 'auto'。 | string / number | — |
| required | 是否必填,如不设置,则根据校验规则确认。 | boolean | — |
| rules | 表单验证规则,详见下表,更多高级用法请查看 async-validator。 | object | — |
| error | 表单域错误信息,设置该值会使表单校验状态变为 error,并立即显示该提示信息。 | string | — |
| show-message | 是否显示校验错误信息。 | boolean | true |
| inline-message | 以行内形式展示校验错误信息。 | boolean | false |
| size | 用于控制该表单域下组件的尺寸。 | 枚举 | — |
| for | 等同于原生标签中的 for。 | string | — |
| validate-status | 表单项的校验状态。 | 枚举 | — |
表单项规则
| 名称 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| trigger | 验证触发方式。 | 枚举 | — |
提示
如果您不希望基于输入事件触发验证器,请在相应的输入类型组件(<el-input>, <el-radio>, <el-select>, ...)上将 validate-event 属性设置为 false。
表单项插槽
| 名称 | 描述 | 类型 |
|---|---|---|
| default | 表单项的内容。 | — |
| label | 自定义标签显示的内容。 | object |
| error | 自定义校验信息显示的内容。 | object |
表单项公开方法
| 名称 | 描述 | 类型 |
|---|---|---|
| size | 表单项尺寸。 | object |
| validateMessage | 校验信息。 | object |
| validateState | 校验状态。 | object |
| validate | 校验表单项。 | Function |
| resetField | 重置当前表单项并移除校验结果。 | Function |
| clearValidate | 移除该表单项的校验状态。 | Function |
| setInitialValue 2.13.1 | 为此字段设置初始值。 当调用 resetField 时,该字段将重置为该值。 | Function |
类型声明
显示声明
type Arrayable<T> = T | T[]
type FormValidationResult = Promise<boolean>
// ValidateFieldsError: see [async-validator](https://github.com/yiminghe/async-validator/blob/master/src/interface.ts)
type FormValidateCallback = (
isValid: boolean,
invalidFields?: ValidateFieldsError
) => Promise<void> | void
// RuleItem: see [async-validator](https://github.com/yiminghe/async-validator/blob/master/src/interface.ts)
interface FormItemRule extends RuleItem {
trigger?: Arrayable<string>
}
type Primitive = null | undefined | string | number | boolean | symbol | bigint
type BrowserNativeObject = Date | FileList | File | Blob | RegExp
type IsTuple<T extends ReadonlyArray<any>> = number extends T['length']
? false
: true
type ArrayMethodKey = keyof any[]
type TupleKey<T extends ReadonlyArray<any>> = Exclude<keyof T, ArrayMethodKey>
type ArrayKey = number
type PathImpl<K extends string | number, V> = V extends
| Primitive
| BrowserNativeObject
? `${K}`
: `${K}` | `${K}.${Path<V>}`
type Path<T> =
T extends ReadonlyArray<infer V>
? IsTuple<T> extends true
? {
[K in TupleKey<T>]-?: PathImpl<Exclude<K, symbol>, T[K]>
}[TupleKey<T>]
: PathImpl<ArrayKey, V>
: {
[K in keyof T]-?: PathImpl<Exclude<K, symbol>, T[K]>
}[keyof T]
type FieldPath<T> = T extends object ? Path<T> : never
// MaybeRef: see [@vueuse/core](https://github.com/vueuse/vueuse/blob/main/packages/shared/utils/types.ts)
// UnwrapRef: see [vue](https://github.com/vuejs/core/blob/main/packages/reactivity/src/ref.ts)
type FormRules<T extends MaybeRef<Record<string, any> | string> = string> =
Partial<
Record<
UnwrapRef<T> extends string ? UnwrapRef<T> : FieldPath<UnwrapRef<T>>,
Arrayable<FormItemRule>
>
>
type FormItemValidateState = (typeof formItemValidateStates)[number]
type FormItemProps = ExtractPropTypes<typeof formItemProps>
type FormItemContext = FormItemProps & {
$el: HTMLDivElement | undefined
size: ComponentSize
validateMessage: string
validateState: FormItemValidateState
isGroup: boolean
labelId: string
inputIds: string[]
hasLabel: boolean
fieldValue: any
propString: string
addInputId: (id: string) => void
removeInputId: (id: string) => void
validate: (
trigger: string,
callback?: FormValidateCallback
) => FormValidationResult
resetField(): void
clearValidate(): void
setInitialValue: (value: any) => void
}