ele-plus-form
v0.7.7
Published
Ele Plus Form是一个基于Element Plus UI库的扩展,用于简化Vue.js应用程序中的表单开发。它提供了一组自定义的表单组件和一些实用的功能,可以帮助您更轻松地构建和管理表单。 Ele Plus Form的特点和功能包括: 1. 自定义表单组件:Ele Plus Form提供了一系列的自定义表单组件,如Input、Select、DatePicker、Upload等,这些组件扩展了Element Plus原有的表单组件,增加了一些便捷的功能和选项。 2. 表单验证:Ele Plus F
Downloads
156
Readme
介绍
Ele Plus Form是一个基于Element Plus UI库的扩展,用于简化Vue.js应用程序中的表单开发。它提供了一组自定义的表单组件和一些实用的功能,可以帮助您更轻松地构建和管理表单。 Ele Plus Form的特点和功能包括:
- 自定义表单组件:Ele Plus Form提供了一系列的自定义表单组件,如Input、Select、DatePicker、Upload等,这些组件扩展了Element Plus原有的表单组件,增加了一些便捷的功能和选项。
- 表单验证:Ele Plus Form内置了表单验证的功能,可以通过简单的配置进行表单字段的校验,包括必填字段、数据类型、最小/最大长度、正则表达式等。
- 表单布局:Ele Plus Form提供了多种表单布局选项,可以根据需要选择水平布局或垂直布局,以及自定义字段的排列方式和样式。
- 表单数据处理:Ele Plus Form提供了方便的表单数据处理方法,可以对表单数据进行格式化、转换和校验,使得数据的处理更加简单和灵活。
- 表单事件处理:Ele Plus Form允许您监听表单的各种事件,如提交表单、重置表单等,以及自定义事件的处理逻辑。
代码预览
<template>
<ele-form ref="eleFormRef" v-model="form" :form-data="formData" />
<el-button type="primary" @click='submit'>提交</el-button>
</template>
<script setup>
import { reactive } from 'vue'
import { defineValue } from 'ele-plus-form'
// 表单配置项
const formData = reactive({
studentName: {
type: 'input', label: '学生姓名', span: 12
},
studentNo: {
type: 'input', label: '身份证号', span: 12
},
sex: {
type: 'radio', label: '性别', option: { 1: '男', 2: '女' }
// 将 radio 改成 select 即可将单选框变成下拉框
// type: 'select'
}
})
// form表单数据
const form = defineValue(formData)
const eleFormRef = ref()
const submit = () => {
eleFormRef.value.validate(() => {
// 校验成功,提交表单
})
}
</script>
一、ElePlusForm
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 | | --- | --- | --- | --- | --- | --- | --- | | formData | 表单数据项 | object | 必填 | - | - | 见下方 | | v-model/modelValue | 表单绑定值 | object | 必填 | - | - | - | | span | 布局分栏数(同Element UI) | number | 选填 | 1-24 | 24 | 8 | | disabled | form全部禁用 | boolean | 选填 | false/true | false | true | | required | 是否必填 | boolean | 选填 | false/true | true | false | | divider | 分割线内容 | string | 选填 | - | - | 基础信息 | | ref | Vue组件的ref属性 | string | - | - | - | - | | message(0.3.3+) | 自定义校验必填时的错误提示 | string | 选填 | - | - | 姓名不能为空 | | minHeight(0.4.4+) | elePlusForm最小高度 | string | 选填 | - | 200px | auto | | maxHeight(0.4.4+) | elePlusForm最大高度 | string | 选填 | - | - | 800px |
Events
| 事件名 | 说明 | 举例 |
| --- | --- | --- |
| validate | 提交验证 | formRef.validate(() => { // todo })
|
| validateField | 验证具体的某个字段 | formRef.validateField(() => { // todo })
|
| resetFields | 重置表单 | formRef.resetFields()
|
| clearValidate | 清理某个字段的表单验证信息 | formRef.clearValidate()
|
表单验证相关
| 参数 | 说明 | 类型 | 可选值 | 默认值 | 举例 | | --- | --- | --- | --- | --- | --- | | required | 表单项是否为必填 | boolean | true/false | true | false | | validator | 自定义验证规则 | array/function | - | - | 同element UI,示例见完整示例 | | rule(0.3.3+) | type为输入框类型时,使用ele-form自带的校验规则或正则规则 | string/RegExp | 手机号、身份证号、邮箱、链接、正数、整数、正整数、金额、中文 | - | 手机号、/^-?\d+$/ |
组合式 API
useDefaultValue(formData: object, defaultForm?: object)
调用 useDefaultValue
方法,接受两个参数:
参数一:当前表单formData
(必传);
参数二:默认的modelValue
参数(选传);
返回值:根据formData
通过Vue3
的reactive
方法自动生成表单项的默认值。
<script setup>
import { useDefaultValue } from 'ele-plus-form'
const formData = ...
const form = useDefaultValue(formData, {
sex: 1,
name: '张三'
})
</script>
二、FormData Attributes
采用键值对
形式,其中key
为表单项字段,value
则为该表单配置项,以下简称attrs
attrs 通用参数
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 | | --- | --- | --- | --- | --- | --- | --- | | type | 表单项类型 | string | 必填 | 见下方 | - | - | | label | 标签文本 | string | 必填 | - | - | - | | required | 是否必填 | boolean/function/number | 选填 | false/true | true | | | disabled | 禁用 | any/function/boolean | 选填 | false/true | false | 0/true/(form) => state.disabled | | show | 控制表单项显隐方法,接受function返回值为布尔类型 | function | 选填 | - | - | (form) => form.type == 1 | | prompt | label后面的提示信息 | object/string | 选填 | - | title默认为“提示”,width默认为200 | {title: '提示', content: '提示内容', width: 200} 、 '提示内容' |
attrs.type 类型
| 类型 | 名称 | | --- | --- | | 输入框类 | 输入框input、数字框number、整数框integer、文本框textarea | | 带选项类 | 下拉框select、单选框radio、radioButton、多选框checkbox、穿梭框transfer (0.3.9+) | | 开关类 | 开关switch | | 日期选择器类 | 年year、月month、年月日date、年月日时分秒datetime、年月日时分秒范围选择datetimerange、年月日范围选择daterange | | 时间选择器类 | 时间time、时间范围timerange | | 上传文件 | upload | | 动态表单 | dynamicForm | | 简单表格 | table | | 富文本 | editor | | 自定义插槽 | slot | | html | html |
三、输入框类
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 |
| --- | --- | --- | --- | --- | --- | --- |
| type | 表单项类型 | string | 必填 | input/number/integer/textarea/password/code (0.2.9+) | - | input |
| placeholder | 占位符 | string/function | 选填 | - | 根据lable自动生成 | 请输入姓名 |
| prepend | type为input/number/integer类型是输入框前置内容 | string | 选填 | - | - | ¥ |
| append | type为input/number/integer类型是输入框后置内容 | string | 选填 | - | - | 元 |
| maxlength | 输入框类型表单项最大内容长度 | number | 选填 | - | 无限制 | 200 |
| rows | type为textarea时的行数 | number | 选填 | - | 4 | 6 |
| min | type为textarea时的行数最小值 | number | 选填 | - | - | - |
| rule | 使用ElePlusForm
内置校验规则 | string | 选填 | phone、idNumber、email、link | - | phone |
| time (0.2.9+) | type为code时,验证码重新发送的时间 | number | 选填 | - | 60 | 30 |
| button (0.4.0+) | 后置按钮 | object | 选填 | - | - | - |
button属性 (0.4.0+)
| 参数 | 说明 | 举例 | | --- | --- | --- | | name | 按钮文本 | 提交 | | onClick | 点击事件 | (value, form) => {} | | 其他属性同Element Plus ElButton属性 | - | - |
Function (0.3.55+新增第二个参数form)
| 参数 | 说明 | 举例 |
| --- | --- | --- |
| onInput | 输入事件 | (value, form) => {} |
| onBlur | 失焦事件 | (value, form) => {} |
| onChange | change事件 | (value, form) => {} |
| onSendCode (0.2.9+) | 发送验证码异步方法,type为code时必传 | (value) => Promise
value:value为输入框的值,调用后需返回 Promise
|
基础示例
const formData = {
name: {
type: 'input',
label: '姓名',
rule: '中文',
onChange: (e) => {
console.log(e)
}
}
}
四、带选项类
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 |
| --- | --- | --- | --- | --- | --- | --- |
| type | 表单项类型 | string | 必填 | select/radio/radioButton/checkbox/transfer(0.3.9+) | - | - |
| option | 带选项类表单项的数据项 | array/object/function | 必填 | - | - | 详见下方 |
| placeholder | type为select时占位符 | string | 选填 | - | type为select时根据lable自动生成 | 根据lable自动生成 |
| labelKey | option为数组时,label的对应key | string | 选填 | - | label | name |
| valueKey | option为数组时,value的对应key | string | 选填 | - | value | id |
| extraKey(0.4.80+) | 下拉框中额外展示的数据字段 | string | 选填 | - | - | name |
| virtual(0.4.80+) | 下拉框是否开启虚拟列表,开启后,el-select
将改为el-select-v2
| boolean | 选填 | - | false | true |
option
| 类型 | 举例 |
| --- | --- |
| 对象 | option: { 1: '张三', 2: '李四' }
|
| 标准数组 | option: [{label: '张三', value: 1}, {label: '李四', value: 2}]
|
| 非标准数组 | option: [{name: '张三', id: 1}, {name: '李四', id: 2}]
labelKey: 'name'
valueKey: 'id'
|
| Function | option: (form) => state.option
|
Function
| 参数 | 说明 | 举例 |
| --- | --- | --- |
| onChange | change事件 | (value/values, item/items, form) => {}
value/values:当前选中的 value
;
item (0.3.0+):单选时为当前 value
对应的 item
;多选时为(multiple、checkbox、transfer)当前选中的多个 value
对应的 items
|
基础示例
// 数组或动态数组形式选项
const state = reactive({
option: [
{ label: '足球', value: 1 },
{ label: '篮球', value: 3 }
]
})
const formData = {
value1: {
type: 'radio',
label: '性别',
option: { 1: '男', 2: '女' }, // 对象形式选项
onChange: (e, item) => {
console.log(e, item)
}
},
value2: {
type: 'radioButton',
label: '性别',
option: { 1: '男', 2: '女' }, // 对象形式选项
onChange: (e, item) => {
console.log(e, item)
}
},
value4: {
type: 'select',
label: '爱好',
option: () => state.option, // 数组或动态数组形式选项
onChange: (e, item) => {
console.log(e, item)
}
},
value5: {
type: 'transfer',
label: '爱好',
option: () => state.option, // 数组或动态数组形式选项
onChange: (e, item) => {
console.log(e, item)
}
},
value6: {
type: 'select',
label: '爱好',
option: () => state.option, // 数组或动态数组形式选项
virtual: true, // 开启虚拟列表
extraKey: 'className', // 额外展示的字段
onChange: (e, item) => {
console.log(e, item)
}
}
}
五、开关类
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | | --- | --- | --- | --- | --- | --- | | type | 表单项类型 | string | 必填 | switch | - | | activeValue | switch 打开时的值 | boolean/string/number | 选填 | - | true | | inactiveValue | switch 关闭时的值 | boolean/string/number | 选填 | - | false |
Function
| 参数 | 说明 | 举例 | | --- | --- | --- | | onChange | change事件 | () => {} |
基础示例
const formData = {
isOpen: {
type: 'switch',
label: '是否启用',
activeValue: 1,
inactiveValue: 0,
onChange: () => {}
}
}
六、日期选择器类
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 | | --- | --- | --- | --- | --- | --- | --- | | type | 表单项类型 | string | 必填 | year/month/date/datetime/datetimerange/daterange | - | - | | placeholder | 输入框类型表单项占位符 | string/function | 选填 | - | 根据lable自动生成 | 请选择日期 | | format | 日期格式 | string | 选填 | - | yyyy-MM-dd HH:mm:ss | - | | pickerOptions | 当前时间日期选择器特有的选项参考下表(同Element UI) | object/function | 选填 | - | - | - | | prepend (0.3.4+) | 选择框前置的内容 | string | 选填 | - | - | 2022年 | | append (0.3.4+) | 选择框后置的内容 | string | 选填 | - | - | :59 |
Function
| 参数 | 说明 | 举例 | | --- | --- | --- | | onChange | change事件 | (value) => {} |
基础示例
const formData = {
date: {
type: 'datetime',
label: '活动开始时间',
onChange: (e) => {
console.log(e)
}
}
}
七、时间选择器类
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 | | --- | --- | --- | --- | --- | --- | --- | | type | 表单项类型 | string | 必填 | time | - | - | | placeholder | 输入框类型表单项占位符 | string/function | 选填 | - | - | 请选择日期 | | format | 日期格式 | string | 选填 | - | HH:mm:ss | - | | pickerOptions | 当前时间日期选择器特有的选项参考下表(同Element UI) | object/function | 选填 | - | - | - | | prepend (0.3.4+) | 选择框前置的内容 | string | 选填 | - | - | 00: | | append (0.3.4+) | 选择框后置的内容 | string | 选填 | - | - | :59 |
Function
| 参数 | 说明 | 举例 | | --- | --- | --- | | onChange | change事件 | (value) => {} |
基础示例
const formData = {
date: {
type: 'time',
label: '放学时间',
onChange: (e) => {
console.log(e)
}
}
}
八、上传文件 (0.2.8+)
全局配置上传接口
在引入Ele Plus Form的时候,需传入uploadApi
方法,uploadApi
的返回值必须为Promise
,即:uploadApi: (file, attrbuites) => Promise
,
调用该Promise
后,期望返回的数据为文件链接:
import ElePlusForm from 'ele-plus-form'
import 'ele-plus-form/dist/style.css'
app.use(ElePlusForm, {
uploadMaxSize: xxx, // 最大文件大小,单位M
uploadApi: (file, attrbuites) => {
// 文件对象
const fileData = new FormData()
fileData.append('file', file)
// 上传时附带的额外参数
for (const key in attrbuites) {
fileData.append(key, attrbuites[key])
}
// 上传接口
uploadApi(fileData).then(({data}) => {
// data 即为文件链接
})
}
})
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 |
| --- | --- | --- | --- | --- | --- |
| type | 表单项类型 | string | 必填 | upload | - |
| fileType | 文件类型 | string | 选填 | image/text | image |
| max | 文件上传最多数量 | number | 选填 | - | 不限制 |
| accept | 文件格式限制 | string | 选填 | 同input[type=file]的
accept属性 | image/* |
| multiple | 是否允许多选 | boolean | 选填 | false/true | false |
| maxSize | 文件最大大小,单位M | number | 选填 | - | 不限制 |
| width (0.3.92+) | 图片上传框宽度 | string | 选填 | - | 100px |
| height (0.3.92+) | 图片上传框高度 | string | 选填 | - | 100px |
| data(自定义参数) | 上传时附带的额外参数 | { [key: string], any } | 选填 | - | - |
| headers(自定义参数) | 设置上传的请求头部 | { [key: string], any } | 选填 | - | - |
| 更多自定义参数 | 自定义参数,即方法uploadApi
参数attrbuites
需要的参数,可自行设置 | any | 选填 | - | - |
Function
| 参数 | 说明 | 举例 |
| --- | --- | --- |
| onChange | 监听文件上传成功后、文件删除后 | (fileList) => {} |
| onBeforeUpload | 监听文件开始上传之前,返回false
禁止上传,无返回值或者返回true
,允许上传 | (fileList) => boolean |
| onBeforeRemove | 监听文件移除之前,返回false
禁止移除,无返回值或者返回true
,允许移除 | (item, index) => boolean |
基础示例
const formData = {
date: {
type: 'upload',
label: '上传图片',
onChange: (fileList) => {
console.log(fileList)
}
}
}
九、动态表单
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 示例 | | --- | --- | --- | --- | --- | --- | --- | | type | 表单项类型 | string | 必填 | dynamicForm | - | dynamicForm | | defaultValue | 每一项的默认值 | object | 必填 | - | {} | { name: '', list: [] } | | formData | 动态表单项集合(同五、FormData Attributes) | object | 必填 | - | - | - | | max | 动态表单项最大添加数量 | number | 选填 | - | - | 5 | | min | 动态表单项最小添加数量 | number | 选填 | - | - | 2 | | dynamic | 是否允许添加、移除 | boolean | 选填 | false/true | true | false | | disabled | 禁用 | boolean | 选填 | false/true | false | true | | itemSpan | 布局分栏 | number | 选填 | 0-24 | 24 | 12 | | className | 类名 | string | 选填 | - | - | form-item | | option(0.4.5+) | 选项模式的选项,多余的参数请组装好放进option里 | array/object/function(同带选项类表单项的option) | 选填 | - | - | [ { label: '苹果', value: 'Apple', price: 2 } ] change时多余的参数如price,会被添加进form里面 | | optionField(0.4.5+) | 选项模式下选项对应的字段名 | string | 选填,声明了option属性后必填 | - | - | - |
Function
| 参数 | 说明 | 举例 |
| --- | --- | --- |
| onAdd | 监听添加动态表单项时,非选项模式下:返回false
禁止添加,无返回值或者返回true
,允许添加 | () => boolean
选项模式:(item) => {} (0.4.5+) |
| onRemove | 监听移除动态表单项时,非选项模式下:返回false
禁止移除,无返回值或者返回true
,允许移除 | (item) => boolean
选项模式:(item) => {} (0.4.5+) |
基础示例
const formData = {
list: {
type: 'dynamicForm',
label: '配置选项',
min: 1,
max: 4,
itemSpan: 12,
defaultValue: {
label: '',
value: ''
},
formData: {
label: {
type: 'input',
label: '选项名称',
span: 12
},
value: {
type: 'input',
label: '选项值',
span: 12
}
}
}
}
// 选项模式 option和optionField
const formData = {
list: {
type: 'dynamicForm',
label: '配置选项',
option: [
{ value: 1, label: '苹果', name: 'Apple' },
{ value: 2, label: '香蕉', name: 'Banan' },
{ value: 3, label: '火龙果', name: 'Huolong' }
],
optionField: 'fruitKey',
max: 2,
itemSpan: 12,
defaultValue: {
label: '',
value: ''
},
formData: {
label: {
type: 'input',
label: '选项名称',
span: 12
},
value: {
type: 'input',
label: '选项值',
span: 12
}
}
}
}
十、简单表格(0.4.73+)
Attributes
| 参数 | 说明 | 类型 | 是否必填 | 可选值 | 默认值 | 举例 |
| --- | --- | --- | --- | --- | --- | --- |
| type | 表单项类型 | string | 必填 | table | - | - |
| option | 带选项类表单项的数据项 | array/function | 必填 | - | - | 详见上方 |
| fields | 表格数据字段 | object | 必填 | - | - | { name: '姓名', sex: '年龄' } |
| maxHeight | 表格最大高度 | string | 非必填 | - | 24vh | 40vh |
| selectable | 是否开启多选 | boolean | 非必填 | true/false | false | true |
| max(0.4.9+) | 开启多选后,最大的选中数量 | number | 非必填 | - | 不限制 | 5 |
| rowKey(0.4.91+) | 开启多选后,行唯一标识,默认为value
(*注:开启多选后,option中必须包含该字段) | string | 开启多选后,必填 | - | value | id |
Function
| 参数 | 说明 | 举例 | | --- | --- | --- | | onChange | change事件 | (values, items, form) => {} |
基础示例
const formData = {
table: {
type: 'table',
label: '学生信息',
option: [
{ name: '李四', value: '1', school: '成都一中', isFirst: true, rowspan: 2 },
{ name: '王五', value: '2', school: '成都一中', isFirst: false, rowspan: 2 },
{ name: '赵二', value: '3', school: '成都二中', isFirst: true, rowspan: 1 }
],
max: 2,
// 表格数据字段
fields: {
school: '学校',
name: '姓名'
},
// 开启多选
selectable: true,
// 合并单元格
spanMethod: ({ row, column }) => {
if (column.label == '学校') {
const { isFirst, rowspan } = row
if (isFirst) {
return { rowspan, colspan: 1 }
} else {
return { rowspan: 0, colspan: 0 }
}
}
}
}
}
十一、富文本
Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 | | --- | --- | --- | --- | --- | | type | 表单项类型 | string | editor | - |
Function
| 参数 | 说明 | 举例 | | --- | --- | --- | | onInput | 输入事件(已添加防抖) | (value) => {} |
基础示例
const formData = {
content: {
type: 'editor',
label: '内容'
}
}
十二、插槽slot
Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 | | --- | --- | --- | --- | --- | | type | 表单项类型 | string | slot | - |
基础示例
<ele-plus-form ref="eleFormRef" v-model="state.form" :form-data="formData">
<template #list>
列表内容
</template>
</ele-plus-form>
const formData = {
list: {
type: 'slot',
label: '列表'
}
}
十三、html
Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 | | --- | --- | --- | --- | --- | | type | 表单项类型 | string | html | - |
基础示例
const formData = {
content: {
type: 'html',
label: 'HTML内容'
}
}