FormEditor表单填写
基础用法
{
"object": {
"object": {}
},
"array": [],
"text": "11"
}
<template>
<div class="wrapper">
<form-editor
ref="formEditor"
:schema="schema"
:value="formData">
</form-editor>
<p style="padding-bottom: 20px;">
<gd-button
@click="onClick">表单校验
</gd-button>
</p>
{{formData}}
</div>
</template>
<script>
const schema = {
text: {
label: '文本',
type: 'text',
rules: [
{ type: 'string', required: true },
{ type: 'string', pattern: '^([1][3,4,5,6,7,8,9])\\d{9}$' },
],
// 栅格布局所占格数
span: 6,
default: '11',
},
number: {
label: '数字',
type: 'number',
span: 6,
depRules: [
{
dep: {
key: 'text',
opt: 'reg',
val: '^([1][3,4,5,6,7,8,9])\\d{9}$',
},
type: 'number',
required: true,
},
],
depStyles: [
{
dep: {
key: 'text',
opt: 'eq',
val: '11',
},
type: 'hidden',
},
],
},
label: {
type: 'label',
label: '这是一段label说明',
},
textarea: {
label: '文本域',
type: 'textarea',
// 仅textarea有效
maxlength: 5,
rules: [
{ type: 'string', max: 4 },
],
// label对齐方式
labelAlign: 'right',
// label的宽度
labelWidth: '110px',
},
radio: {
// 字符/数字, 如: 'gd'
label: '单选-radio',
type: 'radio',
options: [
{ label: '广东', value: 'gd' },
{ label: '江西', value: 'jx' },
{ label: '山东', value: 'sd' },
],
},
select: {
// 字符/数字, 如: 'gd'
label: '单选-select',
type: 'select',
options: [
{ label: '广东', value: 'gd' },
{ label: '江西', value: 'jx' },
{ label: '山东', value: 'sd' },
],
props: {
filterable: true,
},
},
checkbox: {
label: '多选',
// 数组, 如: ['gd', 'jx']
type: 'checkbox',
options: [
{ label: '广东', value: 'gd' },
{ label: '江西', value: 'jx' },
{ label: '山东', value: 'sd' },
],
},
boolean: {
label: '布尔值',
type: 'boolean',
},
region: {
label: '地区',
type: 'region',
},
object: {
label: '对象',
type: 'object',
fields: {
text: {
type: 'text',
label: '文字',
},
number: {
type: 'number',
},
object: {
type: 'object',
expand: false,
fields: {
name: {
type: 'text',
label: '姓名',
},
age: {
type: 'number',
},
},
},
},
},
array: {
label: '数组',
type: 'array',
fields: {
name: {
type: 'text',
rules: [
{ type: 'string', required: true },
],
},
age: {
type: 'number',
},
},
},
custom: {
label: '自定义渲染函数',
render: (h, { value, keyName, schema, supKeyName }) => <gd-input
value={value[keyName]}
onInput={(val) => {
// 手动实现双向绑定
value[keyName] = val;
}}
/>,
},
datetime: {
type: 'datetime',
label: '日期',
},
};
export default {
data () {
return {
formData: {},
schema,
};
},
methods: {
onClick () {
this.$refs.formEditor.validate(
(data) => {
console.log('验证成功', data);
},
(data) => {
console.log('验证失败', data);
},
);
},
},
mounted () {
setTimeout(() => {
this.formData = {
'object': {
'object': { 'name': '2222', 'age': 3333 },
'text': '222', 'number': 333333,
},
'array': [],
datetime: '2019-11-11 12:00:00',
};
}, 1000);
},
};
</script>
<style lang="less">
.wrapper {
h2 {
margin-bottom: 20px;
}
}
</style>
异步数据
{}
<template>
<div class="wrapper">
<form-editor
ref="formEditor"
:schema="schema"
:value="formData">
</form-editor>
{{formData}}
</div>
</template>
<script>
const schema = {
select: {
label: '单选-select',
type: 'select',
options: [],
},
};
export default {
data () {
return {
formData: {},
schema,
};
},
mounted () {
setTimeout(() => {
this.schema.select.options = [
{ label: '广东', value: 'gd' },
{ label: '江西', value: 'jx' },
{ label: '山东', value: 'sd' },
];
}, 5000);
},
};
</script>
依赖校验
{
"textPattern": "1",
"textLen": "1"
}
<template>
<div class="wrapper">
<form-editor
ref="formEditor"
:colcount="2"
:schema="schema"
:value="formData">
</form-editor>
<p style="padding-bottom: 20px;">
<gd-button
@click="onClick">表单校验
</gd-button>
</p>
{{formData}}
</div>
</template>
<script>
const schema = {
labelRequired: {
type: 'label',
label: '依赖非空',
span: 12,
},
depRequired: {
label: '依赖',
type: 'text',
},
textRequired: {
label: '文本',
type: 'text',
depRules: [
{
dep: {
key: 'depRequired',
opt: 'eq',
val: '1',
},
type: 'string',
required: true,
message: '依赖为1时, 文本不能为空',
},
{
dep: {
key: 'depRequired',
opt: 'gt',
val: '10',
},
type: 'string',
required: true,
message: '依赖大于10时, 文本不能为空',
},
],
},
labelPattern: {
type: 'label',
label: '依赖正则',
span: 12,
},
depPattern: {
label: '依赖',
type: 'text',
},
textPattern: {
label: '文本',
type: 'text',
default: '1',
depRules: [
{
dep: {
key: 'depPattern',
opt: 'reg',
val: '^([1][3,4,5,6,7,8,9])\\d{9}$',
},
type: 'string',
pattern: '^([1][3,4,5,6,7,8,9])\\d{9}$',
message: '依赖符合正则时, 文本不符合正则',
},
{
dep: {
key: 'depPattern',
opt: 'in',
val: '1,3,5',
},
type: 'string',
pattern: '^([1][3,4,5,6,7,8,9])\\d{9}$',
message: '依赖为1,3,5其中之一时, 文本不符合正则',
},
],
},
labelLen: {
type: 'label',
label: '依赖大小',
span: 12,
},
depLen: {
label: '依赖',
type: 'text',
},
textLen: {
label: '文本',
type: 'text',
default: '1',
depRules: [
{
dep: {
key: 'depLen',
opt: 'nie',
},
type: 'string',
len: 10,
message: '依赖不为空时, 文本长度需为10',
},
],
},
};
export default {
data () {
return {
formData: {},
schema,
};
},
methods: {
onClick () {
this.$refs.formEditor.validate(
(data) => {
this.$toast.success('验证成功');
console.log('验证成功', data);
},
(data) => {
this.$toast.error('验证失败');
console.log('验证失败', data);
},
);
},
},
};
</script>
<style lang="less">
.wrapper {
h2 {
margin-bottom: 20px;
}
}
</style>
依赖样式
{}
<template>
<div class="wrapper">
<form-editor
ref="formEditor"
:colcount="2"
:schema="schema"
:value="formData">
</form-editor>
<p style="padding-bottom: 20px;">
<gd-button
@click="onClick">表单校验
</gd-button>
</p>
{{formData}}
</div>
</template>
<script>
const schema = {
labelHidden: {
type: 'label',
label: '依赖隐藏',
span: 12,
},
depHidden: {
label: '依赖',
type: 'text',
placeholder: '依赖为空时, 隐藏文本输入框(依赖不为空时, 显示文本输入框)',
},
textHidden: {
label: '文本',
type: 'text',
depStyles: [
{
dep: {
key: 'depHidden',
opt: 'ie',
},
type: 'hidden',
},
{
dep: {
key: 'depHidden',
// 依赖大于10时, 文本输入框隐藏
opt: (depVal) => {
return depVal > 10;
},
},
type: 'hidden',
},
],
},
labelDisabled: {
type: 'label',
label: '依赖禁用',
span: 12,
},
depDisabled: {
label: '依赖',
type: 'text',
placeholder: '依赖大于等于10时, 禁用文本输入框',
},
textDisabled: {
label: '文本',
type: 'text',
depStyles: [
{
dep: {
key: 'depDisabled',
opt: 'gte',
val: '10',
},
type: 'disabled',
},
],
},
labelReadonly: {
type: 'label',
label: '依赖只读',
span: 12,
},
depReadonly: {
label: '依赖',
type: 'text',
placeholder: '依赖小于等于10时, 文本输入框只读',
},
textReadonly: {
label: '文本',
type: 'text',
depStyles: [
{
dep: {
key: 'depReadonly',
opt: 'lte',
val: '10',
},
type: 'readonly',
},
],
},
};
export default {
data () {
return {
formData: {},
schema,
};
},
methods: {
onClick () {
this.$refs.formEditor.validate(
(data) => {
this.$toast.success('验证成功');
console.log('验证成功', data);
},
(data) => {
this.$toast.error('验证失败');
console.log('验证失败', data);
},
);
},
},
};
</script>
<style lang="less">
.wrapper {
h2 {
margin-bottom: 20px;
}
}
</style>
属性配置
props
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
schema | 表单配置, 请参考表单数据配置规范 | object | — | - |
value | 表单数据 | object | — | - |
size | 表单元素尺寸 | string | large,small,mini | - |
disabled | 禁用状态 | Boolean | — | false |
readonly | 只读状态 | Boolean | — | false |
active-key | 激活的key | String | — | - |
colcount | 表单显示列数 | Number | 1, 2, 3, 4, 6, 12 | 1 |
gutter | col之间的间距 | Number | - | 30 |
label-width | label的宽度 | String | - | - |
label-align | label的文字对齐方式 | left,center,right | - | - |
schema.field options (字段配置项)
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
type | 表单域类型 | String | label,text,number,textarea,radio,select,checkbox,boolean,region,object,array,nation,date,year,month,datetime,time | text |
label | 表单域label说明 | String | — | - |
rules | 校验规则, 详细请参考: async-validator | Array | - | - |
maxlength | 输入的最大长度, 仅field.type=textarea/text有效 | Number | — | - |
disabled | 禁用状态 | Boolean | — | false |
readonly | 只读状态 | Boolean | — | false |
span | 表单项所占的横向格数(栅格布局, 总格数为12) | Number | 1-12 | 12 |
labelWidth | label的宽度 | String | - | - |
labelAlign | label的文字对齐方式 | left,center,right | - | - |
render | 表单域自定义渲染函数, 表单域将渲染该函数返回的值 | Function | - | - |
options | 选项数据源, radio,select,checkbox时有效, 格式如: [ { label, value }, { label, value } ] 或 [ value, value ] | Array | - | - |
pcaJson | 地区组件数据源, region时有效 | Array | - | - |
props | 其他属性对象, 将直接v-bind到表单组件上 | Object | - | - |
depRules | 依赖校验规则 | Array | - | - |
depStyles | 依赖样式 | Function | - | - |
depRules.item options (依赖校验规则配置项)
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
dep | 依赖条件 | Object | - | - |
...rule | 校验规则其他属性, 详细请参考: async-validator | - | - | - |
depStyles.item options (依赖样式配置项)
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
dep | 依赖条件 | Object | - | - |
type | 样式类型, 如: 隐藏(hidden) | String | readonly,disabled,hidden | - |
dep options
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
key | 依赖表单域的字段名 | String | - | - |
opt | 操作符, 如: 相等(eq), 不为空(nie) | String, Function | eq: 等于, neq: 不等于, ie: 为空, nie: 不为空, lt: 小于, lte: 小于等于, gt: 大于, gte: 大于等于, in: 枚举在, reg: 符合正则 | - |
val | 依赖表单域的值 | String, Number | - | - |
events
参数 | 说明 | 返回值 |
---|---|---|
fieldadd | 添加项事件 | type, keyName |
fieldsort | 排序 | keys |
itemclick | 项点击 | {keyName} |
methods
参数 | 说明 |
---|---|
validate | 数据校验 |