Form 表单
表单由输入框、单选框、选择器、复选框等控件组成,用于收集、校验与提交数据。
TIP
组件已升级为 Flex 布局,替代旧的浮动布局。
典型表单
包含输入框、选择器、单选框、复选框等。
每个表单项需使用 form-item 作为容器包裹控件。
行内表单
垂直空间有限且表单较简单时,可在一行内排布。
将 inline 设为 true。
对齐方式
标签可按设计选择不同对齐。
可为单个 u-form-item 设置 label-position;为空时继承 u-form 的 label-position。
label-position 为 top 时标签在控件上方;为 left 时标签在左侧(通常需配合 label-width)。
校验
通过规则校验数据,便于发现与修正错误。
在 Form 上设置 rules,并在需要校验的 FormItem 上设置对应的 prop。更多规则写法见 async-validator
自定义校验规则
演示如何实现二次密码确认等自定义规则。
使用 status-icon 以图标展示校验结果。
TIP
自定义校验函数必须被调用。进阶用法见 async-validator。
动态增删表单项
除在表单上一次性传入全部规则外,也可在单个表单项上动态增删规则。
数字校验
数字校验建议在 v-model 上使用 .number 修饰符,将字符串转为数值。
TIP
当 u-form-item 嵌套在另一个 u-form-item 内时,内层标签宽度为 0;若需要可单独设置内层 label-width。
尺寸
表单内组件默认继承表单的 size;FormItem 也支持 size。
若不希望某个控件继承尺寸,可单独为其设置 size。
无障碍
当 u-form-item 内仅有一个输入类控件(或选择框、复选框等相关控件)时,标签会自动关联该控件。若同一 u-form-item 内有多个控件,表单项会被赋予 WAI-ARIA 的 group 角色,此时需自行保证每个控件具备可读的辅助标签。
表单 API
Form 属性
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| model | 表单数据模型 | object | — |
| rules | 校验规则 | object | — |
| inline | 是否行内表单 | boolean | false |
| label-position | 标签位置;为 left/right 时通常需设置 label-width | enum | right |
| label-width | 标签宽度,如 '50px';子级表单项会继承;支持 auto | string / number | '' |
| label-suffix | 标签后缀 | string | '' |
| hide-required-asterisk | 是否隐藏必填星号 | boolean | false |
| require-asterisk-position | 星号位置 | enum | left |
| show-message | 是否显示错误信息 | boolean | true |
| inline-message | 错误信息是否与表单项行内展示 | boolean | false |
| status-icon | 是否显示校验状态图标 | boolean | false |
| validate-on-rule-change | rules 变更时是否重新校验 | boolean | true |
| size | 表单内控件尺寸 | enum | — |
| disabled | 是否禁用表单内控件;以子组件自身配置为准 | boolean | false |
| scroll-to-error | 校验失败时是否滚动到第一项错误 | boolean | false |
| scroll-into-view-options | 校验失败滚动行为,参见 scrollIntoView | object / boolean | true |
Form 事件
| 名称 | 说明 | 类型 |
|---|---|---|
| validate | 任一表单项校验后触发 | Function |
Form 插槽
| 名称 | 说明 | 子标签 |
|---|---|---|
| default | 自定义默认内容 | FormItem |
Form 暴露
| 名称 | 说明 | 类型 |
|---|---|---|
| validate | 校验整个表单;可传入回调或返回 Promise | Function |
| validateField | 校验指定字段 | Function |
| resetFields | 重置字段并清除校验结果 | Function |
| scrollToField | 滚动到指定字段 | Function |
| clearValidate | 清除全部或指定字段的校验信息 | Function |
| fields | 获取全部表单项上下文 | array |
| getField | 获取单个表单项上下文 | Function |
| setInitialValues | 设置字段初始值;调用 resetFields 时将恢复到这些值 | Function |
表单项 API
FormItem 属性
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prop | 对应 model 的键名,可为路径(如 a.b.0 或 ['a','b','0']);使用 validate、resetFields 时必填 | string / string[] | — |
| label | 标签文本 | string | — |
| label-position | 标签位置;为 left/right 时需设置 label-width;默认继承表单 | enum | '' |
| label-width | 标签宽度;支持 auto | string / number | — |
| required | 是否必填;未设置时由规则推断 | boolean | — |
| rules | 校验规则,见下表;进阶见 async-validator | object | — |
| error | 手动设置错误文案;设置后立即显示为错误态 | string | — |
| show-message | 是否显示错误信息 | boolean | true |
| inline-message | 行内展示错误信息 | boolean | false |
| size | 表单项内控件尺寸 | enum | — |
| for | 同原生 label 的 for | string | — |
| validate-status | 校验状态 | enum | — |
FormItemRule
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| trigger | 校验触发时机 | enum | — |
TIP
若不希望根据输入事件触发校验,可在对应输入类组件(<u-input>、<u-radio>、<u-select> 等)上将 validate-event 设为 false。
FormItem 插槽
| 名称 | 说明 | 类型 |
|---|---|---|
| default | 表单项内容 | — |
| label | 自定义标签区域 | object |
| error | 自定义错误信息展示 | object |
FormItem 暴露
| 名称 | 说明 | 类型 |
|---|---|---|
| size | 表单项尺寸 | object |
| validateMessage | 校验提示文案 | object |
| validateState | 校验状态 | object |
| validate | 校验当前表单项 | Function |
| resetField | 重置当前字段并清除校验结果 | Function |
| clearValidate | 清除当前字段校验状态 | Function |
| setInitialValue | 设置当前字段初始值;调用 resetField 时将恢复到该值 | Function |
类型声明
展开类型声明
type Arrayable<T> = T | T[]
type FormValidationResult = Promise<boolean>
// ValidateFieldsError: 见 [async-validator](https://github.com/yiminghe/async-validator/blob/master/src/interface.ts)
type FormValidateCallback = (
isValid: boolean,
invalidFields?: ValidateFieldsError
) => Promise<void> | void
// RuleItem: 见 [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: 见 [@vueuse/core](https://github.com/vueuse/vueuse/blob/main/packages/shared/utils/types.ts)
// UnwrapRef: 见 [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
}