表单

表单由 inputradioselectcheckbox 等组成。通过表单,您可以收集、验证和提交数据。

TIP

该组件已升级为弹性布局,以取代旧的浮动布局。

以下示例展示当前默认布局、校验提示和操作区写法。

基本形式

包括inputselectradiocheckbox等各种输入项。

在每个 form 组件中,您需要一个 form-item 字段作为输入项的容器。

活动名称
活动区域
请选择一个区域
上线日期
上线时间
立即配送
活动类型
资源类型
活动简介
0 / 120

默认布局

Form 默认使用纵向排列、标签置顶和文档流内的校验提示。

这个示例展示当前默认的表单布局。展开 Select / SelectV2 可以继续查看确认与取消流程。

投放名称
地区
请选择一个地区
受众
请选择受众分组
预算
立即上线
摘要
0 / 140

TIP

W3C 规定

当表单中只有一个单行文本输入字段时,用户代理应接受该字段中的 Enter 作为提交表单的请求。

为了防止这种行为,您可以在 <el-form> 上添加 @submit.prevent

验证

表单组件允许您验证数据,帮助您发现并纠正错误。

只需为Form组件添加rules属性,通过验证规则,并将FormItemprop属性设置为需要验证的特定密钥即可。请参阅异步验证器了解更多信息。

活动名称
活动区域
请选择区域
参与人数
请选择预期人数
上线日期
上线时间
立即配送
活动地点
活动类型
资源类型
活动简介
0 / 140

自定义验证规则

本示例展示了如何自定义自己的验证规则来完成双因素密码验证。

这里我们使用 status-icon 将验证结果反映为图标。

校验流程

密码确认会立即校验,年龄则会在失焦后进行异步校验。

TIP

必须调用自定义验证回调函数。在 async-validator 中查看更多高级用法。

添加/删除表单项

除了在表单组件上一次性传递所有验证规则外,您还可以在单个表单字段上动态传递验证规则或删除规则。

动态校验

每个新增域名都会保留自己的校验规则,删除操作也与最终提交按钮保持分离。

邮箱
域名 1

号码验证

Number Validate 需要在输入 v-model 绑定上添加 .number 修饰符,用于将字符串值转换为 Vue 提供的数字。

为什么重要

普通输入框默认先返回字符串,`.number` 修饰符会在数字规则执行前先完成类型转换。

年龄

尺寸控制

表单中的所有组件都从该表单继承其 size 属性。同样,FormItem也有一个size属性。

如果您不希望该组件从 From 或 FormItem 继承其大小,您仍然可以微调每个组件的 size

组件尺寸
活动名称
活动区域
请选择区域
上线日期
上线时间
活动类型
资源类型

辅助功能

el-form-item 内只有一个输入(或相关控件,例如选择或复选框)时,表单项的标签将自动附加到该输入。但是,如果 el-form-item 内部有多个输入,则表单项将被分配 groupWAI-ARIA 角色。在这种情况下,您有责任为各个输入分配辅助标签。

单个输入项标签

当一个表单项只包含一个输入框时,姓名 标签会自动绑定到该输入框。

姓名
分组输入项

个人信息 标签作用于整组内容,因此每个输入框仍然需要单独提供 aria-label

个人信息

表单API

表单属性

名称描述类型默认
型号表单组件的数据。对象
规则表单的验证规则。对象
标签后缀标签的后缀。字符串''
隐藏所需星号是否隐藏必填字段的标签旁边应有一个红色星号(星号)。布尔值
需要星号位置星号的位置。枚举
显示消息是否显示错误信息。布尔值真实
内联消息是否在表单项内显示错误消息。布尔值
状态图标是否显示指示验证结果的图标。布尔值
规则更改时验证rules 属性更改时是否触发验证。布尔值真实
尺寸控制此表单中组件的大小。枚举
已禁用是否禁用此表单中的所有组件。在 2.12.0 之前,如果设置为 true,它将覆盖内部组件的 disabled 属性。在2.12.0之后,内部组件的配置优先。布尔值
滚动至错误当验证失败时,滚动到第一个错误表单条目。布尔值
滚动到视图选项 2.3.2当验证失败时,它会根据scrollIntoView选项滚动到第一个错误项。 滚动到视图对象 / 布尔值真实

表单事件

名称描述类型
验证验证表单项后触发功能

表单插槽

名称描述子标签
默认自定义默认内容表单项

表单暴露

名称描述类型
验证验证整个表格。接收回调或返回Promise功能
验证字段验证指定字段。功能
重置字段重置指定字段并删除验证结果。功能
滚动到字段滚动到指定字段。功能
清除验证清除所有或指定字段的验证消息。功能
字段 2.7.3获取所有字段上下文。数组
getField 2.10.2获取字段上下文。功能
设置初始值 2.13.1设置表单字段的初始值。当调用 resetFields 时,字段将重置为这些值。功能

表单项 API

表单项属性

名称描述类型默认
propmodel 的字段键名。它可以是属性路径(例如 a.b.0['a', 'b', '0'])。在使用 validateresetFields 方法时,该属性是必需的。字符串 / 字符串[]
标签标签文本。字符串
必填该字段是否为必填字段,如果省略,将由验证规则确定。布尔值
规则表单校验规则见 下表,更高级的用法见 async-validator对象
错误字段错误消息,设置其值,字段将验证错误并立即显示此消息。字符串
显示消息是否显示错误信息。布尔值真实
内联消息内联样式验证消息。布尔值
尺寸控制此表单项中组件的大小。枚举
for与原生 label 元素中的 for 属性相同。字符串
验证状态formItem 的验证状态。枚举

表单项规则

名称描述类型默认
trigger验证器的触发时机。枚举

TIP

如果您不想根据输入事件触发验证器,请在相应的输入类型组件(<el-input><el-radio><el-select>,...)上将 validate-event 属性设置为 false

表单项槽

名称描述类型
默认表单项的内容。
标签要在标签上显示的自定义内容。对象
错误显示验证消息的自定义内容。对象

FormItem 暴露

名称描述类型
尺寸表格项目尺寸。对象
验证消息验证消息。对象
验证状态验证状态。对象
验证验证表单项。功能
重置字段重置当前字段并删除验证结果。功能
清除验证删除字段的验证状态。功能
设置初始值 2.13.1设置该字段的初始值。当调用 resetField 时,该字段将重置为该值。功能

类型声明

显示声明
ts
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
}