Form 表单
表单支持数组和表单配置,示例中大部分使用了对象配置
基础用法(数组配置)
基础用法(对象配置)
内置组件
组件的props
下面的例子展示如果给组件添加props,props: (formInstance => Props) | Props 可以是函数或者是对象,item: (formInstance => Props) | Props; 以下带选项的组件:select、radio、checkbox可以通过设置 dataItemProps 来设置某项的props
插槽
可以通过定义type:"slot"来实现插槽,作用域上可以获取formExpose上所有API
组件的插槽
可以通过定义slots来实现组件的插槽,目前支持input、number、select、cascader和扩展组件
扩展组件
自定义表单组件,只需要组件上实现 v-model 双向绑定,即可与表单一起使用。下面是一个很简单的选择图标的扩展组件的例子,你必须全局注册或在表单全局配置中局部注册该组件;表单给组件传入了formExpose上所有API和绑定了FromComponentOption的props和event
v1.0.2后, 也可以传入VNode或者返回VNode的方法
自定义选择图标组件代码
<template>
<div>
<el-radio-group v-model="model" @change="emits('change', $event)">
<el-radio value="search">
<el-icon>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-v-6fbb019e="">
<path
fill="currentColor"
d="m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704"
></path>
</svg>
</el-icon>
</el-radio>
<el-radio value="house">
<el-icon>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-v-6fbb019e="">
<path
fill="currentColor"
d="M192 413.952V896h640V413.952L512 147.328zM139.52 374.4l352-293.312a32 32 0 0 1 40.96 0l352 293.312A32 32 0 0 1 896 398.976V928a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V398.976a32 32 0 0 1 11.52-24.576"
></path>
</svg>
</el-icon>
</el-radio>
</el-radio-group>
</div>
</template>
<script lang="ts" setup>
defineOptions({
name: 'IconSelect'
})
const model = defineModel({ type: String })
const emits = defineEmits(['change'])
</script>组件前置或者后置内容
可以使用prepend和append定义组件前置和后置内容,使用componentPrepend和componentAppend定义全部组件的前置和后置内容
带数据选项的组件
组件数据
异步数据
对于select、radio、checkbox、cascader类型组件,可以通过asyncData配置组件的异步数据,asyncData要求是一个函数,并返回Promise;异步数据可自行解析,详情请看异步数据解析器
props和数据的联动性
组件间的数据联动
组件的显示与隐藏
表单验证(复杂验证)
当表单验证规则需要用到表单数据时,可以传入一个函数,函数返回类型为FormRules
Form Attributes
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
formProps | 原生 el-form 的 props,透传给内部 ElForm | Partial<ElFormProps> | {} |
options | 表单配置,支持对象和数组两种写法(见 FormOptions) | FormOptions | {} |
rules | 表单校验规则;也可传函数,参数为 FormInstance | FormRules | ((formInstance: FormInstance) => FormRules) | {} |
model | 表单初始值(会拷贝一份作为内部 formData) | Record<string, any> | {} |
autoGetAsyncData | 是否在组件挂载后自动拉取 asyncData;当表单在 Dialog 内使用时不会自动触发 | boolean | true |
componentPrepend | 所有表单项统一前置内容 | (formExpose: FormInstance) => VNode | null |
componentAppend | 所有表单项统一后置内容 | (formExpose: FormInstance) => VNode | null |
rowProps | el-row 的 props | Partial<RowProps> | null |
colProps | el-col 的默认 props(会与单项 colProps 合并) | Partial<ColProps> | {} |
FormOptions
FormOptions 支持两种结构:
FormMapOptions:对象写法,key由对象键名自动生成FormListOptions:数组写法,每一项必须显式提供key
export type FormOptions = FormMapOptions | FormListOptionsFormMapOptions
export type FormMapOptions = {
[key: string]: FormMapOption
}FormMapOption 可为:
string(等价于{ type: 'input', label: string })Omit<FormInputOption, 'key'>Omit<FormNumberOption, 'key'>Omit<FormSelectOption, 'key'>Omit<FormRadioOption, 'key'>Omit<FormCheckboxOption, 'key'>Omit<FormSwitchOption, 'key'>Omit<FormCascaderOption, 'key'>Omit<FormDateOption, 'key'>Omit<FormSlotOption, 'key'>Omit<FormExtendOption, 'key'>
FormListOptions
export type FormListOptions = Array<FormListOption>FormListOption 为以下联合类型:
FormInputOptionFormNumberOptionFormSelectOptionFormRadioOptionFormCheckboxOptionFormSwitchOptionFormCascaderOptionFormDateOptionFormSlotOptionFormExtendOption
FormComponentOption
FormComponentOption 是大多数组件项共享的基础配置:
| 名称 | 说明 | 类型 | 必填 | 默认值 |
|---|---|---|---|---|
key | 字段标识(对象写法会自动注入) | string | 是 | - |
type | 组件类型 | string | 是 | - |
label | el-form-item 标签文本 | string | 否 | key |
props | 组件 props,支持对象或函数 | Partial<Record<string, any>> | ((formInstance: FormInstance) => Partial<Record<string, any>>) | 否 | {} |
show | 是否显示该项 | boolean | ((formExpose: FormInstance) => boolean) | 否 | true |
colProps | 当前项 el-col 配置 | Partial<ColProps> | 否 | {} |
formItemProps | 当前项 el-form-item 配置 | Partial<FormItemProps> | 否 | {} |
event | 组件事件映射 | (instance: FormInstance) => Record<string, Function> | 否 | {} |
slots | 组件插槽映射 | (instance: FormInstance) => Record<string, VNode> | 否 | {} |
prepend | 当前项前置内容 | (formExpose: FormInstance) => VNode | VNode | 否 | - |
append | 当前项后置内容 | (formExpose: FormInstance) => VNode | VNode | 否 | - |
warpCss | 组件包裹层样式(.elh-form-item__component-wrap) | CSSProperties | 否 | {} |
data | 选项数据(下拉/单选/多选/级联) | Array<any> | Record<string, any> | 否 | [] |
labelGetter | 选项标签解析器 | (item: any, index: string | number) => any | 否 | - |
valueGetter | 选项值解析器 | (item: any, index: string | number) => any | 否 | - |
asyncData | 异步选项数据函数 | (instance: FormInstance, ...args: any[]) => Promise<any> | 否 | - |
dataItemProps | 选项项级 props | Partial<Record<string, any>> | ((formInstance: FormInstance, data: any, dataItem: any, index: string | number) => Partial<Record<string, any>>) | 否 | {} |
WARNING
限制说明:
input/number不支持:data、labelGetter、valueGetter、asyncData、dataItemPropscascader仅支持:data、asyncData,不支持:labelGetter、valueGetter、dataItemProps
FormRadioOption
| 名称 | 说明 | 类型 | 必填 | 默认值 |
|---|---|---|---|---|
button | 是否使用按钮样式单选 | boolean | 否 | false |
FormCheckboxOption
| 名称 | 说明 | 类型 | 必填 | 默认值 |
|---|---|---|---|---|
button | 是否使用按钮样式多选 | boolean | 否 | false |
FormExtendOption
| 名称 | 说明 | 类型 | 必填 | 默认值 |
|---|---|---|---|---|
component | 扩展组件定义 | string | VNode | ((formInstance: FormInstance) => VNode | null) | 是 | - |
Form Expose
表单通过 defineExpose 暴露 FormInstance:
| 名称 | 说明 | 类型 |
|---|---|---|
formData | 当前表单数据(响应式) | Record<string, any> |
model | 传入的原始 model | Record<string, any> |
elForm | 内部 ElForm 实例引用 | MaybeRef<ElFormInstance> |
componentData | 组件选项数据(来自 data / asyncData) | Record<string, any> |
getData | 触发表单校验并返回数据;校验失败时 reject(fields) | <T = any>() => Promise<T> |
setData | 合并设置表单数据(浅合并) | (data: Record<string, any>) => void |
resetData | 重置表单字段(调用 elForm.resetFields()) | () => void |
getAsyncData | 批量拉取异步选项数据;不传时拉取全部含 asyncData 的项 | (key?: string | string[]) => void |
execAsyncDataFunc | 执行指定字段的 asyncData,支持透传参数 | (key: string, ...args: any[]) => void |
clearComponentData | 清空指定字段的选项数据,并将对应 formData[key] 置为 undefined | (key: string | string[]) => void |