Skip to content

Form

ElForm 表单增强

提示

支持 element-plusForm 表单组件,以及本组件库的组件。建议优先使用本组件库的组件

使用

fields 绑定的是一个具有响应式的数组时,数组的变动会影响表单变动(及动态表单)。如果不需要动态表单推荐绑定一个普通数组,

基础用法

支持动态 Rules,动态禁用,动态显示功能。支持字段名称多层级(name.value 最终会解析成 {name: {value: null}}

内置 Label

提示

目前支持 n-input n-select n-date-picker 组件

分组使用

添加 group 属性进行分组

提示

只支持一级分组,不支持嵌套。并且在开启收起展开的时候,只会收起item组件,不会收起卡片和块组件。点下面的展开查看问题

网格

与使用 el-row 和 el-col 组件相同 (el-col 对应 field),通过相关配置可以自由地组合布局。

Props

NameDescriptionTypeOptionsDefault
v-model绑定值object--
fields表单项配置,参考下面 fields 属性array--
action操作项按钮配置,参考下面 action属性object--
inner-label是否使用内置 label 模式,element-plus 组件无效boolean-false
enter-on-submit输入框回车触发提交按钮点击事件,如果开启则自定义的 onKeyup事件无效booleanfalse
validate-on-submit点击提交按钮的时候校验表单,拦截并提示校验不通过的内容booleantrue
first-auto-focus进入页面第一个输入框是否获取焦点,只有第一个元素是 input 的时候有效booleantrue
show-more是否显示更多,需要配合limit使用,如果需要记住状态需要配置 RouteName,我们会把 RouteName 做为保存在浏览器中的 keybooleanfalse
limit最多显示多少个field项,showMore=true的时候有效number4
highlight-error表单验证不通过的时候输入框是否高亮boolean-true
highlight-required表单必填项输入框是否高亮boolean-true
gutterel-row 栅格间隔,如果定义了group属性默认一个group属性就是一个el-row标签number-0
justifyel-row flex 布局下的水平排列方式,如果定义了group属性默认一个group属性就是一个el-row标签stringstart / end / center / space-around / space-betweenstart
alignel-rowflex 布局下的垂直排列方式,如果定义了group属性默认一个group属性就是一个el-row标签stringtop / middle / bottomtop
field-adaptive表单项自适应栅格系统,开启后会自动添加{ md: 8, xl: 6, sm: 12, xs: 24 }属性boolean-false
fixed-action是否把表单的操作按钮固定在左边,查询表单的时候很有用boolean-false
enter-next回车是否跳转到下一个元素boolean-true
scroll-to-error校验不通过示范滚动当第一个错误项boolean-true
field-map-to-time用于将表单内时间区域的应设成 2 个字段,见下方说明[string, [string, string], string?,boolean?][]--
fiexd-error-message是否固定验证失败消息在右下角boolean-false
remote-field是否远程加载 field,如果远程加载 field 需要设置为 trueboolean-false

支持 el-form 的所有属性

fieldMapToTime

代码片段来源 Vben Admin

将表单内时间区域的值映射成 2 个字段

如果表单内有时间区间组件,获取到的值是一个数组,但是往往我们传递到后台需要是 2 个字段

ts

fieldMapToTime: [
  // data为时间组件在表单内的字段,startTime,endTime为转化后的开始时间于结束时间
  // 'YYYY-MM-DD'为时间格式,参考moment
  ['datetime', ['startTime', 'endTime'], 'YYYY-MM-DD'],
  // 支持多个字段
  ['datetime1', ['startTime1', 'endTime1'], 'YYYY-MM-DD HH:mm:ss'],
  // 支持开始时间和结束时间,如果设置了第四个参数,那么第三个参数会默认为:YYYY-MM-DD HH:mm:ss
  ['datetime2', ['startTime2', 'endTime2'], 'YYYY-MM-DD', true],
],


// fieldMapToTime没写的时候表单获取到的值
{
  datetime: [Date(),Date()]
}
//  ['datetime', ['startTime', 'endTime'], 'YYYY-MM-DD'],之后
{
    datetime: [Date(),Date()],
    startTime: '2020-08-12',
    endTime: '2020-08-15',
}

// ['datetime2', ['startTime2', 'endTime2'], 'YYYY-MM-DD', true]
{
    datetime2: [Date(),Date()],
    startTime2: "2022-06-15 00:00:00",
    endTime2: "2022-07-15 23:59:59"
}

fields Props

NameDescriptionTypeOptionsDefault
prop表单域 model 字段, 在使用 validate、resetFields 方法的情况下,该属性是必填的string--
label标签string--
component当前项对应的组件,可以直接传入局部组件,支持elment-plus Form 表单组件string / Component--
props传递的对应的组件的参数object--
show是否显示该itembooleanTRUE
if-show动态控制是否显示item项。返回 true 渲染,false 不渲染Function(modelValue):boolean--
if-disabled动态控制禁用状态Function(modelValue):boolean--
if-rules动态校验规则,返回最新的rules数组Function(modelValue,rules):Array[FormItemRule]--
default-value默认值string / number / boolean / array / object--
show-helper是否显示提示图标,自定义头部插槽的时候无效boolean-FALSE
helper-message提示内容,show-helper为真的时候有效string / string[]--
extra-messageForm item添加额外信息和帮助信息string--
group分组,请参考group属性object--
span栅格占据的列数。el-col的属性,每个 item 就是一个el-colnumber-24
offset栅格左侧的间隔格数。el-col的属性,每个 item 就是一个el-colnumber-0
push栅格向右移动格数。el-col的属性,每个 item 就是一个el-colnumber-0
pull栅格向左移动格数。el-col的属性,每个 item 就是一个el-colnumber-0
xs<768px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
sm≥768px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
md≥992px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
lg≥1200px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
xl≥1920px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
customClass自定义ELFormItem样式string--

关于 Fields

支持 el-form-item 的所有属性

props 的属性将全部传递给 component 指定的组件

  • 对于存在连字符的属性,可以通过字符串包裹或者转换为驼峰结构
  • 通过 slots 可以向组件传递简单的渲染函数
  • 对于事件需要通过 on[Event] 驼峰这种形式绑定。如:change -> onChange, input -> onInput
js
import { markRaw } from 'vue'
import { Search } from '@element-plus/icons-vue'
props: {
  clearable: true,
  'prefix-icon': markRaw(Search),
  suffixIcon: markRaw(Search),
  slots: {
    prefix: () => h('ElIcon', { icon: markRaw(Search) }),
    append: () => '搜索'
  },
  onChange: e => console.log(e),
}

group Props

NameDescriptionTypeOptionsDefault
card是否卡片模式,false 块状模式boolean-false
title标题string--
border是否显示边框,只在卡片模式下生效boolean-false
shawod是否显示阴影,只在卡片模式下生效boolean-false
className样式类名string--
ifShow动态显示组,不配置或者函数返回true的时候才显示(modelValue: T) => boolean--
children分组下的fields属性array-[]

分组不支持嵌套,可查看分组示例

action Props

该表单项栅格系统默认为:{ md: 8, xl: 6, sm: 12, xs: 24 }

NameDescriptionTypeOptionsDefault
submit是否显示 submit 按钮boolean-true
submitTextsubmit 按钮显示的文字string-提交
submitPropssubmit 按钮的配置,参考 el-buttonobject-
reset是否显示 reset 按钮boolean-true
resetText是否显示 reset 按钮显示的文字string-重置
resetPropsreset 按钮的配置,参考 el-buttonobject--
align对齐方式stringleft / right / center-
span栅格占据的列数。el-col的属性,每个 item 就是一个el-colnumber-24
offset栅格左侧的间隔格数。el-col的属性,每个 item 就是一个el-colnumber-0
push栅格向右移动格数。el-col的属性,每个 item 就是一个el-colnumber-0
pull栅格向左移动格数。el-col的属性,每个 item 就是一个el-colnumber-0
xs<768px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
sm≥768px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
md≥992px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
lg≥1200px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--
xl≥1920px 响应式栅格数或者栅格属性对象。el-col的属性,每个 item 就是一个el-colnumber / object--

Events

NameDescriptionParameters
submitsubmit 被点击后触发,使用done()函数来关闭loading状态done, isValid, invalidFields
resetreset 按钮被点击后触发-
nextDone回车跳转到下一个元素开启后,最后一个元素回车后回调事件-
validate任一表单项被校验后触发被校验的表单项 prop 值, isValid, invalidFields

Methods

NameDescriptionParameters
submitForm手工调用提交表单事件() => void
resetForm清空表单所有数据,除非在 field 字段设置了默认值(defaultValue) () => void
getDefaultValues获取 field 设置了默认值(defaultValue)的数据 () => Record<string, unknown>
setErrors设置表单错误信息(fields: ValidateError[]) => void
resetEnterNextEvent重置回车下一个元素下标。在你有动态 item 的时候可以使用它来重置回车顺序() => void

提示

如果使用 typescript 可以从组件中导出 FormExpose 提供更好的类型推导。参考如下在 setup 中使用

vue
<template>
  <n-form ref="ruleForm" v-model="form" :fields="fields" />
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import type { FormExpose } from 'element-pro'

export default defineComponent({
  setup() {
    const ruleForm = ref<FormExpose>({} as FormExpose)

    function clearValidate() {
      ruleForm.value.clearValidate()
    }

    return { ruleForm, clearValidate }
  }
})
</script>

Slots

NameDescription
-按钮节点之前的内容
form-before字段开始之前的内容
form-after按钮节点之后的内容
action-before在重置按钮之前的内容
action-after在提交按钮之后的内容,如果开启更多按钮则在更多按钮前面
[prop]当前这项的 Form Item 的内容,参数为{ item, value, setValue }
[prop]-label当前这项的标签文本的内容,参数为 { item }
[prop]-error当前这项的自定义表单校验信息的显示方式,参数为 { error, item }

提示

[prop] 为 fields 中定义的 prop

TypeScript 定义

ts
export declare function defineFormFields<T = any>(fileds: Array<FormField<T>>): Array<FormField<T>>
export declare function defineFormGropuFileds<T = ExternalParam>(
  fileds: FormGroup<T>[]
): FormGroup<T>[]
export declare function defineFormActions(action: FormAction): FormAction
export declare const defineFormMethod: () => Ref<FormExpose>

interface ValidateError {
  message: string
  field: string
}

粤ICP备2022017444号