BeansFlight-JSON-FORM
版本号:verison 0.23.17
一份配置,轻松搞定配置 Vue 表单渲染
表单可以说是前端开发中最经常遇到的元素之一。在日常表单的开发中,存在着 v-if 条件渲染、满屏 magic number 枚举值,再加上表单之间的复杂的联动交互的情况,往往使得一个看似简单的表单变得愈加臃肿不堪。
表单的联动关系与状态重置往往散落在各个函数方法中,随着需求的不断扩充与变更,使得表单之间的耦合复杂度上升,对于后续的开发者而言,很难清晰快速地了解表单中隐含的业务逻辑与联动关系,这使得表单变得非常不便于维护。
特性
- 数据收集、校验和提交功能的表单生成器,
- 支持双向数据绑定和事件扩展,
- 包含如下组件
- 复选框、
- 单选框
- 输入框、
- 下拉选择框等表单元素
- 省市区三级联动,时间选择,
- 日期选择
- 文件/图片上传等功能组件
- 富文本编辑器
一· form 支持的类型文本类型
1.Input:输入框
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| extendType |
输入框类型,可选值为 text、password、textarea、url、email、date、number、tel, 通过设置属性 type 为 textarea 来使用文本域,用于多行输入。 |
String |
text |
| placeholder |
通过设置属性 rows 控制文本域默认显示的行数。占位文本 |
String |
- |
| disabled |
设置输入框为禁用状态 |
Boolean |
false |
| control |
组件回调函数 |
Object |
{} |
Input.extendType
| 属性 |
说明 |
类型 |
| text |
如果不指定 extendType 则为 text 类型。 |
String |
| password |
在 extendType="password" 时,开启属性 password 可以切换显示隐藏密码。 |
String |
| number |
通过设置属性 extendType 为 textarea 来控制 input 只能输入 number. |
String |
| textarea |
通过设置属性 extendType 为 textarea 来使用文本域,用于多行输入。 |
String |
|
|
|
Input.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
2.Select: 下拉框
基础上属性
| 属性 |
说明 |
类型 |
默认值 |
| multiple |
是否支持多选 |
Boolean |
false |
| disabled |
是否禁用 |
Boolean |
false |
| placeholder |
选择框默认文字 |
String |
请选择 |
| options |
下拉框选项 |
Object | Function |
{} |
| control |
组件回调函数 |
Object |
{} |
select.options
select.options 有 2 中传参形式:
{
label: "下拉框",
type: "select",
key: "status",
options: [
{ value: "0", label: "否" },
{ value: "1", label: "是" },
{ value: "2", label: "男" },
{ value: "3", label: "女" },
],
span: 8,
},
{
label: "下拉框",
type: "select",
key: "status",
options: (value) => {
// tempOpts 在data属性中声明
return this.tempOpts
},
span: 8,
},
select.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
| change |
下拉框值改变时会掉此函数, (val) 为选中的值 |
Function |
option 中选中的项 |
|
|
|
|
3.DatePicker: 日期选择器
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| extendType |
显示类型,可选值为 date、daterange、datetime、datetimerange、year、month |
String |
date |
| placeholder |
占位文本 |
String |
空 |
| disabledDate |
设置不可选择的日期,参数为当前的日期,需要返回 Boolean 是否禁用这天 |
Function |
date |
| disabled |
是否禁用选择器 |
Boolean |
false |
| control |
组件回调函数 |
Object |
{} |
datePicker.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
4.Cascader: 级联组件
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| disabled |
是否禁用选择器 |
Boolean |
False |
| placeholder |
输入框占位符 |
String |
请选择 |
| trigger |
次级菜单展开方式,可选值为 click 或 hover |
String |
hover |
| control |
组件回调函数 |
Object |
{} |
cascader.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
5.Checkbox: 多选框
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| disabled |
是否禁用当前项 |
Boolean |
false |
| label |
只在组合使用时有效。指定当前选项的 value 值,组合会自动判断是否选中 |
String| Number|Boolean |
Boolean |
| control |
组件回调函数 |
Object |
{} |
checkbox.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
6.Radio: 单选框
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| disabled |
是否禁用当前项 |
Boolean |
false |
| border |
是否显示边框 |
Boolean |
False |
| label |
只在组合使用时有效。指定当前选项的 value 值,组合会自动判断是否选中 |
String| Number|Boolean |
Boolean |
| control |
组件回调函数 |
Object |
{} |
redio.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
7.Switch: 滑块
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| disabled |
禁用开关 |
Boolean |
false |
| control |
组件回调函数 |
Object |
{} |
switch.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
8.upload: 文件上传
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| uploadTitle |
文件上传按钮标题 |
String |
’‘ |
| headers |
设置上传的请求头部 |
Object |
{} |
| action |
上传的地址,必填 |
String |
- |
| formate |
支持的文件类型,format 是识别文件的后缀名 |
|
[] |
| multiple |
是否支持多选文件 |
Boolean |
False |
| control |
组件回调函数 |
Object |
{} |
upload.control
| 属性 |
说明 |
类型 |
默认值 |
| error |
文件上传失败时的钩子,返回字段为 error, file, fileList, cb |
Function |
- |
| success |
文件上传成功时的钩子,返回字段为 response, file, fileList,cb |
Function |
- |
| formateError |
文件格式验证失败时的钩子,返回字段为 file, fileList,cb |
Function |
- |
| remove |
文件列表移除文件时的钩子,返回字段为 file, fileList,cb |
Funtion |
- |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
9.rich: 富文本编辑器
基础属性
| 属性 |
说明 |
类型 |
默认值 |
| height |
编辑器默认高度 |
Number |
400 |
| placeholder |
编辑器默认描述 |
String |
- |
| key |
编辑器输入的值 |
String |
- |
| control |
组件回调函数 |
Object |
- |
rich.control
| 属性 |
说明 |
类型 |
默认值 |
| handle |
用于处理表单联动, handel(form)为表单数据 |
Function |
表单数据 |
|
|
|
|
|
|
|
|
二·安装依赖与配置
依赖安装
yarn add beansflight-json-form
在 main.js 配置引入如下配置
//main.js
....
import beansflightForm from 'beansflight-json-form';
import 'beansflight-json-form/beansflightJsonForm/beansflight-json-form.css';
Vue.use(beansflightForm);
....
三·表单类型
1 tablePanel - 列表
页面展示
使用方式
<table-panel
border
ref="mainTable"
:panelConfig="panelConfig"
@newAction="newAction"
@batchDeleteAction="batchDeleteAction"
@allExportAction="allExportAction"
@allExportAction="allExportAction"
:columns="mainTable.columnArray"
:value="mainTable.data"
:loading="mainTable.loading"
:pageNumber="queryForm.pageNum"
:pageSize="queryForm.pageSize"
:pageShow="true"
:pageTotal="mainTablePage.total"
@onChangePageNum="changeMainTablePagePageNum"
@onChangePageSize="changeMainTablePagePageSize"
@on-row-click="onRowClick"
>
</table-panel>
Table-panel 属性
| 属性 |
必填项 |
类型 |
描述 |
默认值 |
| panelConfig |
true |
Object |
用于配置列表项顶部安装 |
- |
| newAction |
False |
Function |
新建按钮回调函数 |
- |
| batchDeleteAction |
false |
Function |
批量删除按钮回调函数 |
- |
| allExportAction |
false |
Function |
导出全部按钮回调函数 |
- |
| batchExportAction |
false |
Function |
批量导出按钮回调函数 |
- |
| columns |
true |
Array |
表格列的配置描述 |
|
| value |
true |
Array |
表格数据 |
|
| loading |
true |
Boolean |
|
|
| pageNumber |
true |
String |
每页返回的数据条数 |
|
| pageSize |
true |
String |
页码 |
|
| pageShow |
false |
Boolean |
是否显示翻页 |
true |
| showTotal |
False |
Boolean |
是否显示总页数 |
false |
| pageTotal |
true |
String |
总页数 |
|
| onChangePageNum |
true |
Function |
切换每页数据条数时的回调函数 |
|
| onChangePageSize |
true |
Function |
切换页码时回调函数 |
|
| onRowClick |
false |
(row,index)=>{} |
单击某一行时触发 |
|
panelConfig
| 属性 |
必填项 |
描述 |
类型 |
默认值 |
备注 |
| show |
true |
是否显示顶部默认 新建、批量删除、导出全部、批量导出按钮 |
Boolean |
true |
|
| options |
true |
如果需要自定列表顶部操作按钮,则需要配置此项 |
Array |
{} |
|
panelConfig.options
| 属性 |
必填项 |
描述 |
类型 |
默认值 |
备注 |
| title |
true |
按钮标题 |
String |
Null |
|
| type |
true |
按钮主题 |
String |
primary |
有四种主题 |
| icon |
true |
按钮图标 |
String |
Null |
|
| privilege |
true |
按钮权限 |
String |
Null |
|
| multiple |
false |
是否为多选操作 |
Boolean |
null |
|
| click |
true |
按钮回调函数 |
Function |
Null |
multiple 为 false 时,调用此函数响应点击事件 |
| multiClick |
false |
多选操作回调函数 |
Function(res) |
Array |
multiple 为 ture 时,调用此函数响应点击事件,返回字段为选中的所有行 |
| hidden |
false |
操作按钮是否可用 |
Function(res) |
Null |
函数返回值类型只能为 Boolean |
panelConfig: {
show: false, // 是否显示顶部默认 新建、批量删除、导出全部、批量导出按钮
options: [
{
title: '逗逗飞新建', // 按钮标题
type: 'primary', // 按钮主题
icon: 'md-add', // 按钮图标
multiple: true,
privilege: 'merchant-info-list-add', // 按钮权限
click: () => {},
multiClick: (res) => console.log("批量操作", res)
hidden: (row) => {
return true | false
},
},
{
title: '逗逗飞新建', // 按钮标题
type: 'info', // 按钮主题
icon: 'ios-trash-outline', // 按钮图标
privilege: 'merchant-info-list-add', // 按钮权限
click: () => {},
},
],
},
columns
| 属性 |
必填项 |
描述 |
类型 |
默认值 |
备注 |
| title |
true |
列头显示文字 |
String |
- |
|
| key |
true |
对应列内容的字段名 |
String |
|
|
| minWidth |
false |
最小列宽 |
Number |
|
|
| type |
false |
用于区分枚举转换/列表操作区 取值范围['switch','enum', 'handler','avatar'] |
String |
- |
如果需要处理枚举则 type: 'enum',如果是列表操作项则 type: 'handler', 显示头像则是 avatar, 如果滑块的话 则是 switch |
| enumKey |
false |
枚举的 key |
|
|
对于项目中维护的枚举的 Key |
| formate |
False |
日期格式化 |
Sring |
- |
格式参照 dayjs |
| align |
false |
列表操作区位置固定 |
String |
- |
如果是列表操作项则必传,固定值 align: 'right', |
| fixed |
false |
列表操作区位置固定 |
String |
- |
如果是列表操作项则必传,固定值 fixed: 'right', |
| options |
False |
列表操作按钮 |
Array |
- |
如果是列表操作项则必传, |
columnArray: [
{
title: '正常',
key: 'code',
minWidth: 100,
},
{
title: '头像',
key: 'avatar_key',
type: 'avatar', // 用于枚举处理
minWidth: 100,
},
{
title: '枚举',
key: 'status',
minWidth: 120,
type: 'enum', // 用于枚举处理
enumKey: 'STATUS',
},
{
title: "日期",
key: "createDate",
formate: "YYYY-MM-DD", 用于日期格式化
minWidth: 140,
},
{
title: '操作',
align: 'right',
fixed: 'right',
width: 150,
type: 'handle',
options: [
{
title: '查看',
type: 'info',
onClick: (row) => {
},
},
{
title: '编辑',
directives: [
{
name: 'privilege',
value: 'agency-info-list-update',
},
],
onClick: (row) => {},
},
],
},
],
columons.options
| 属性 |
必填项 |
描述 |
类型 |
默认值 |
备注 |
| title |
true |
按钮标题 |
String |
- |
|
| type |
false |
按钮主题色 |
String |
- |
type 取值范围:['info','success','primary','warning,'error'] |
| onClick |
true |
按钮回调函数 |
Function |
(row)=>{} |
|
| directives |
false |
按钮权限 |
Array |
- |
|
| deleteFlag |
false |
控制气泡提示框显式,隐藏 |
Boolean |
false |
属性多用于删除操作 |
| deleteTitle |
false |
气泡提示框标题 |
String |
您确认删除这条内容吗? |
deleteFlag=true 时,deleteTitle 属性才会生效 |
DEMO
columnArray: [
{
title: '商户编号',
key: 'code',
minWidth: 100,
},
{
title: '商户状态',
key: 'status',
minWidth: 120,
type: 'enum',
enumKey: 'STATUS',
},
{
title: '电子邮件',
key: 'email',
minWidth: 140,
},
{
title: '操作',
align: 'right',
fixed: 'right',
width: 150,
type: 'handle',
options: [
{
title: '查看',
type: 'info',
onClick: (row) => {
this.$refs.merchantTableDetail.showModal(row);
},
},
{
title: '编辑',
directives: [
{
name: 'privilege',
value: 'agency-info-list-update',
},
],
onClick: (row) => {},
},
{
title: "删除",
type: "error",
deleteFlag: true,
deleteTitle: "删除提示信息",
directives: [
{
// name: "privilege",
value: "agency-info-list-update",
},
],
onClick: (row) => {},
},
],
},
],
2 queryPanel - 查询
页面展示
使用方式
<query-panel :config="formConfig" @query="query" @reset="reset">
</query-panel>
query-panel 属性
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
备注 |
| config |
true |
查询项配置 |
Object |
- |
|
| query |
true |
查询事件回调函数 |
Function |
(params)=>{} |
|
| reset |
false |
重置按钮回调函数 |
Fcuntion |
()=>{} |
|
config
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
备注 |
| formModel |
true |
v-model 绑定项 |
Object |
- |
框架目前支持 4 中交互 input:输入框、select:下拉列表、日历:dataPicker、Cascader:省市区级联 |
| formItems |
true |
布局项 |
Array |
|
用于绘制查询项表单 |
config.formModel
formModel: {
cascVal: [], // 级联
selOptions: null, // 下拉框
inputVal: null, // 输入框
datePickerVal: null, // DatePicker
},
config.formItems
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| label |
true |
输入框标题 |
- |
|
| key |
true |
绑定的值 |
- |
|
| type |
true |
组件类型 type 取值范围:[select、input、datePicker、 cascader] |
- |
|
| placeholder |
true |
占位文字 |
- |
|
| span |
true |
24 栏布局 占比 如果不传则是 6 |
- |
|
| control |
false |
操作项 |
- |
|
config.formItems.control
| 属性 |
必填项 |
说明 |
默认值 |
说明 |
| on |
false |
组件回调函数 |
(Event)=>{} |
目前只实现了 Select、cascader |
DEMO
formItems: [
{
row: [
{
label: '省市区', // 标题
key: 'cascVal', //
type: 'cascader', // 组件类型 不区分大小写 级联多用于省市区选择 type 取值范围:[select、input、datePicker、 cascader]
placeholder: '请选择城市/区县(可搜索)', // 占位文字
span: 6, // 24栏布局 占比 如果不传则是6
control: {
// 操作项
on: {
change: () => {
// 回调函数
}
}
},
options: [
// 数据选项
{
value: 'beijing',
label: '北京',
children: [
{
value: 'gugong',
label: '故宫'
},
{
value: 'tiantan',
label: '天坛'
},
{
value: 'wangfujing',
label: '王府井'
}
]
},
{
value: 'jiangsu',
label: '江苏',
children: [
{
value: 'nanjing',
label: '南京',
children: [
{
value: 'fuzimiao',
label: '夫子庙'
}
]
},
{
value: 'suzhou',
label: '苏州',
children: [
{
value: 'zhuozhengyuan',
label: '拙政园'
},
{
value: 'shizilin',
label: '狮子林'
}
]
}
]
}
]
},
{
label: '场地',
key: 'selOptions',
type: 'select',
span: 6,
options: [
// 下拉框数据
{
label: '全部',
value: '全部'
},
{
label: '零食区',
value: '零食区间'
}
]
},
{
label: '商户编号',
key: 'inputVal',
placeholder: '占位符',
type: 'Input', // 输入框
span: 6
},
{
label: '时间框',
key: 'datePickerVal',
placeholder: '占位符',
type: 'datePicker', // 输入框
// extendType: 'daterange', // date 单选 daterange 时间段
span: 6
}
]
}
]
3 editFormPanel - 编辑
页面展示
使用方式
<edit-form-panel
title="编辑或新建"
v-model="isShowDetailModal"
displayed="model"
:data="detail"
:config="editConfig"
@sumbit="sumbit"
@cancel="cancel"
>
<template v-slot:footer="data">
<div>底部按钮布局</div>
<div>{{ data }}</div>
</template>
</edit-form-panel>
edit-form-panel 属性
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| title |
true |
标题 |
- |
- |
| v-model |
true |
控制弹窗是否显示 |
False |
- |
| data |
true |
表单项绑定对象 |
- |
- |
| label-width |
true |
表单域标签的宽度 |
- |
- |
| config |
true |
表单配置项 |
- |
- |
| footer |
false |
页脚插槽 |
slot |
- |
| sumbit |
true |
确认按钮回调函数 |
(params) =>{} |
- |
| cancel |
true |
取消按钮回调函数 |
()=>{} |
- |
config
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| splitLine |
false |
是否显示分栏布局 |
false |
纵向分栏 |
| lineTitle |
false |
分栏标题 |
- |
|
| row |
true |
如果在一个行内布局,则用 row 嵌套 |
- |
|
config.row
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| label |
true |
label 标题 |
- |
|
| type |
true |
组件类型 不区分大小写 type 取值范围['datePicker', 'input', 'select', 'cascader'] |
- |
|
| extendType |
false |
组件扩展类型 |
|
|
| key |
true |
绑定的值 |
- |
|
| placeholder |
false |
占位文字 |
- |
|
| rule |
false |
必填项验证 |
- |
|
| props |
false |
扩展属性 |
|
|
| control |
false |
输入项交互 |
|
|
config.row.control
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| handel |
false |
输入项联动回调函数 |
(formdata)=> {} |
|
| enumOption |
false |
输入项枚举值转换 |
- |
enumOption: { type: "STATUS", }, |
| formatOption |
false |
输入项格式化 |
- |
formatOption: { format: "YYYY-MM-DD", }, |
DEMO
editConfig: [
{
splitLine: true, // 是否显示分栏布局 纵向分栏
lineTitle: '分割线', // 分栏标题
row: [ // 如果在一个行内布局,则用row嵌套
{
label: '修改日期', // label标题
type: 'datePicker', // 组件类型 不区分大小写 type取值范围['datePicker', 'input', 'select', 'cascader']
extendType: 'daterange', // 取值范围 [date 单选 daterange 时间段 ]
key: 'modifyDate', // 显示的字段名
placeholder: '占位符', // 占位文字
rule: [{ // 必填项验证
type: 'date', required: true, message: '时间不能为空', trigger: 'blur',
}],
props: {
// 扩展属性
disabled: true, // 设置输入框为禁用状态
},
span: 8,
},
{
label: '商户地址',
type: 'input',
key: 'address',
extendType: "password", // 取值范围[text、password、textarea、url、email、date、number、tel]
key: "name",
props: {
// 扩展属性
disabled: true, // 设置输入框为禁用状态
},
rule: [{ required: true, message: '请输入地址', trigger: 'blur' }],
span: 12,
},
],
},
],
4 detailFormPanel - 查看
页面展示
使用方式
<detail-form-panel
title="商户详情"
v-model="isShowDetailModal"
:data="detail"
:config="detailConfig"
displayed="drawer"
>
<template v-slot:footer="data">
<div>底部按钮布局</div>
<div>{{ data }}</div>
</template>
</detail-form-panel>
detail-form-panel 属性
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
备注 |
| title |
true |
标题 |
String |
- |
|
| v-model |
true |
页面显示隐藏 |
Boolean |
- |
|
| footer |
false |
页脚插槽 |
Slot |
- |
|
| label-width |
true |
表单域标签的宽度 |
Number |
- |
|
| data |
true |
表单项绑定对象 |
Object |
- |
|
| config |
true |
页面配置 |
Object |
- |
|
| displayed |
false |
显示方式 支持三种显示方式 model:弹窗显示、drawer:抽屉弹窗显示(右侧) |
String |
'model' |
|
config
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
| splitLine |
false |
是否显示分栏布局 |
false |
纵向分栏 |
| lineTitle |
false |
分栏标题 |
- |
|
| row |
true |
如果在一个行内布局,则用 row 嵌套 |
- |
|
config.row
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| label |
true |
label 标题 |
- |
|
| type |
true |
组件类型 不区分大小写 type 取值范围['datePicker', 'input', 'select', 'cascader'] |
- |
|
| extendType |
false |
组件扩展类型 |
|
|
| key |
true |
绑定的值 |
- |
|
| placeholder |
false |
占位文字 |
- |
|
| rule |
false |
必填项验证 |
- |
|
| props |
false |
扩展属性 |
|
|
| control |
false |
输入项交互 |
|
|
config.row.control
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| on |
false |
输入项交互回调函数 |
{} |
|
| hiddenOption |
false |
输入项联动回调函数 |
(formdata)=> {} |
|
| enumOption |
false |
输入项枚举值转换 |
- |
enumOption: { type: "STATUS", }, |
| formatOption |
false |
输入项格式化 |
- |
formatOption: { format: "YYYY-MM-DD", }, |
DEMO
config: [
{
row: [
{
label: '修改日期',
type: 'datePicker',
key: 'modifyDate',
placeholder: '占位符',
// rule: [{
// type: 'date', required: true, message: '时间不能为空', trigger: 'blur',
// }],
// extendType: 'daterange', // date 单选 daterange 时间段
span: 24,
},
],
},
{
row: [
{
label: '商户地址',
type: 'input',
key: 'address',
// rule: [{ required: true, message: '请输入地址', trigger: 'blur' }],
extendType: '', // 扩展type
span: 24,
},
],
},
],
5 newFormPanel - 新建
页面展示
使用方式
<NewFormPanel
title="新建"
v-model="isShowDetailModal"
:data="newForm"
:config="newConfig"
@sumbit="sumbit"
@cancel="cancel"
>
</NewFormPanel>
new-form-panel 属性
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
| title |
true |
标题 |
String |
- |
| v-model |
true |
页面显示隐藏 |
Boolean |
- |
| label-width |
true |
表单域标签的宽度 |
Number |
- |
| footer |
false |
页脚插槽 |
Slot |
- |
| data |
true |
表单项绑定对象 |
Object |
- |
| config |
true |
页面配置 |
Object |
- |
config
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
| splitLine |
false |
是否显示分栏布局 |
false |
纵向分栏 |
| lineTitle |
false |
分栏标题 |
- |
|
| row |
true |
如果在一个行内布局,则用 row 嵌套 |
- |
|
config.row
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| label |
true |
label 标题 |
- |
|
| type |
true |
组件类型 不区分大小写 type 取值范围['datePicker', 'input', 'select', 'cascader'] |
- |
|
| extendType |
false |
组件扩展类型 |
|
|
| key |
true |
绑定的值 |
- |
|
| placeholder |
false |
占位文字 |
- |
|
| rule |
false |
必填项验证 |
- |
|
| props |
false |
扩展属性 |
|
|
| control |
false |
输入项交互 |
|
|
config.row.control
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| on |
false |
输入项交互回调函数 |
{} |
|
| hiddenOption |
false |
输入项联动回调函数 |
(formdata)=> {} |
|
| enumOption |
false |
输入项枚举值转换 |
- |
enumOption: { type: "STATUS", }, |
| formatOption |
false |
输入项格式化 |
- |
formatOption: { format: "YYYY-MM-DD", }, |
DEMO
newConfig: [
{
row: [
{
label: "商户名称",
type: "input",
// extendType: "password", // 取值范围[text、password、textarea、url、email、date、number、tel]
key: "name",
props: {
// 扩展属性
// disabled: true, // 设置输入框为禁用状态
},
span: 8,
},
{
label: "测试滑块",
type: "switch",
// extendType: "password", // 取值范围[text、password、textarea、url、email、date、number、tel]
key: "switchKey",
props: {
// 扩展属性
// disabled: true, // 设置输入框为禁用状态
},
span: 8,
},
{
label: "商户统一定价",
type: "select",
key: "isUniformprice",
options: [
{ value: "0", label: "否" },
{ value: "1", label: "是" },
],
span: 8,
control: { // 组件联动 Switch为选中时,显示此组件
handle: (form) => {
return form.switchKey === true;
},
},
},
{
label: "商户状态",
// type: "select",
key: "status",
props: {
// disabled: true, //是否禁用
},
options: [
// { value: "0", label: "否" },
{ value: "1", label: "是" },
],
span: 8,
control: { // 组件联动
handle: (form) => {
return form.switchKey === true;
},
},
},
],
},
],
6 formPanel - 展示
页面展示
使用方式
<form-panel :data="panelData" :config="panelConfig"></form-panel>
form-panel 属性
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
备注 |
| data |
true |
表单项绑定对象 |
Object |
- |
|
| label-width |
true |
表单域标签的宽度 |
Number |
- |
|
| config |
true |
页面配置 |
Object |
- |
|
config
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
| splitLine |
false |
是否显示分栏布局 |
false |
纵向分栏 |
| lineTitle |
false |
分栏标题 |
- |
|
| row |
true |
如果在一个行内布局,则用 row 嵌套 |
- |
|
config.row
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| label |
true |
label 标题 |
- |
|
| type |
true |
组件类型 不区分大小写 type 取值范围['datePicker', 'input', 'select', 'cascader'] |
- |
|
| extendType |
false |
组件扩展类型 |
|
|
| key |
true |
绑定的值 |
- |
|
| placeholder |
false |
占位文字 |
- |
|
| rule |
false |
必填项验证 |
- |
|
| props |
false |
扩展属性 |
|
|
| control |
false |
输入项交互 |
|
|
config.row.control
| 属性 |
必填项 |
说明 |
默认值 |
备注 |
| on |
false |
输入项交互回调函数 |
{} |
|
| hiddenOption |
false |
输入项联动回调函数 |
(formdata)=> {} |
|
| enumOption |
false |
输入项枚举值转换 |
- |
enumOption: { type: "STATUS", }, |
| formatOption |
false |
输入项格式化 |
- |
formatOption: { format: "YYYY-MM-DD", }, |
DEMO
panelConfig: [
{
row: [
{
label: "商户名称",
type: "input",
extendType: "textarea", // 取值范围[text、password、textarea、url、email、date、number、tel]
key: "name",
props: {
// 扩展属性
disabled: true, // 设置输入框为禁用状态
border: false, // 不显示边框
bottom: 1,
},
control: {
// 组件联动
hiddenOption: (form) => {
return form.isUniformprice === "0"
},
},
span: 8,
},
{
label: "商户统一定价",
type: "input",
// type: "select",
key: "isUniformprice",
control: {
// 组件enum
enumOption: {
type: "STATUS",
},
},
span: 8,
},
{
label: "修改时间",
type: "input",
key: "modifyDate",
control: {
// 时间格式化
formatOption: {
format: "YYYY-MM-DD",
},
},
span: 8,
},
],
},
],
四·表单必填项验证
表单验证功能同样也是表单不可或缺的功能之一,JSONFom 通过 rule 节点来实现必填项验证
rule 支持的验证数据类型
| 属性 |
说明 |
| string |
验证是否为字符串 |
| number |
验证是否为 number |
| boolean |
验证是否为 number |
| method |
验证是否为 method |
| integer |
验证是否为 integer |
| float |
验证是否为 float |
| array |
验证是否为 array |
| object |
验证是否为 object |
| email |
验证是否为 email |
rule
| 属性 |
必填项 |
说明 |
类型 |
默认值 |
| type |
true |
需要验证的数据格式 |
String |
stirng |
| required |
true |
是否为必填项 |
Boolean |
- |
| message |
true |
必填项提示信息 |
String |
- |
| trigger |
true |
验证触发方式 |
String |
- |
formConfig: [
...
{
row: [
{
...
rule: [
{
type: "array",
required: true,
message: "支付渠道不能为空",
trigger: "blur",
},
]
...
}
]
}
...
]