Skip to content

Form 表单

表单支持数组和表单配置,示例中大部分使用了对象配置

基础用法(数组配置)

基础用法(对象配置)

内置组件

组件的props

下面的例子展示如果给组件添加props,props: (formInstance => Props) | Props 可以是函数或者是对象,item: (formInstance => Props) | Props; 以下带选项的组件:selectradiocheckbox可以通过设置 dataItemProps 来设置某项的props

插槽

可以通过定义type:"slot"来实现插槽,作用域上可以获取formExpose上所有API

组件的插槽

可以通过定义slots来实现组件的插槽,目前支持inputnumberselectcascader扩展组件

扩展组件

自定义表单组件,只需要组件上实现 v-model 双向绑定,即可与表单一起使用。下面是一个很简单的选择图标的扩展组件的例子,你必须全局注册或在表单全局配置中局部注册该组件;表单给组件传入了formExpose上所有API和绑定了FromComponentOptionpropsevent

v1.0.2后, 也可以传入VNode或者返回VNode的方法

自定义选择图标组件代码
vue
<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>

组件前置或者后置内容

可以使用prependappend定义组件前置和后置内容,使用componentPrependcomponentAppend定义全部组件的前置和后置内容

带数据选项的组件

组件数据

异步数据

对于selectradiocheckboxcascader类型组件,可以通过asyncData配置组件的异步数据,asyncData要求是一个函数,并返回Promise;异步数据可自行解析,详情请看异步数据解析器

props和数据的联动性

组件间的数据联动

组件的显示与隐藏

表单验证(复杂验证)

当表单验证规则需要用到表单数据时,可以传入一个函数,函数返回类型为FormRules

Form Attributes

名称说明类型默认值
formProps原生 el-form 的 props,透传给内部 ElFormPartial<ElFormProps>{}
options表单配置,支持对象和数组两种写法(见 FormOptionsFormOptions{}
rules表单校验规则;也可传函数,参数为 FormInstanceFormRules | ((formInstance: FormInstance) => FormRules){}
model表单初始值(会拷贝一份作为内部 formDataRecord<string, any>{}
autoGetAsyncData是否在组件挂载后自动拉取 asyncData;当表单在 Dialog 内使用时不会自动触发booleantrue
componentPrepend所有表单项统一前置内容(formExpose: FormInstance) => VNodenull
componentAppend所有表单项统一后置内容(formExpose: FormInstance) => VNodenull
rowPropsel-row 的 propsPartial<RowProps>null
colPropsel-col 的默认 props(会与单项 colProps 合并)Partial<ColProps>{}

FormOptions

FormOptions 支持两种结构:

  • FormMapOptions:对象写法,key 由对象键名自动生成
  • FormListOptions:数组写法,每一项必须显式提供 key
ts
export type FormOptions = FormMapOptions | FormListOptions

FormMapOptions

ts
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

ts
export type FormListOptions = Array<FormListOption>

FormListOption 为以下联合类型:

  • FormInputOption
  • FormNumberOption
  • FormSelectOption
  • FormRadioOption
  • FormCheckboxOption
  • FormSwitchOption
  • FormCascaderOption
  • FormDateOption
  • FormSlotOption
  • FormExtendOption

FormComponentOption

FormComponentOption 是大多数组件项共享的基础配置:

名称说明类型必填默认值
key字段标识(对象写法会自动注入)string-
type组件类型string-
labelel-form-item 标签文本stringkey
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-wrapCSSProperties{}
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选项项级 propsPartial<Record<string, any>> | ((formInstance: FormInstance, data: any, dataItem: any, index: string | number) => Partial<Record<string, any>>){}

WARNING

限制说明:

  • input / number 不支持:datalabelGettervalueGetterasyncDatadataItemProps
  • cascader 仅支持:dataasyncData,不支持:labelGettervalueGetterdataItemProps

FormRadioOption

名称说明类型必填默认值
button是否使用按钮样式单选booleanfalse

FormCheckboxOption

名称说明类型必填默认值
button是否使用按钮样式多选booleanfalse

FormExtendOption

名称说明类型必填默认值
component扩展组件定义string | VNode | ((formInstance: FormInstance) => VNode | null)-

Form Expose

表单通过 defineExpose 暴露 FormInstance

名称说明类型
formData当前表单数据(响应式)Record<string, any>
model传入的原始 modelRecord<string, any>
elForm内部 ElForm 实例引用MaybeRef<ElFormInstance>
componentData组件选项数据(来自 data / asyncDataRecord<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

MIT Licensed.