JSON表单的配置分为两种,暂且称描述表单信息的为表单配置,描述表单组件信息的为组件配置。JSON表单的配置必定是两种配置的组合。segmentfault
在开始讲解配置以前先介绍几个专业名词:数组
{ formKey: 'test-form', className: 'test-form', realTimeSubmit: true, data: { // 表单数据 }, assistData: { // 逻辑数据 }, config: [ // 组件配置 ], style: { label: {}, wrap: {} } }
属性 | 是否必传 | 说明 | 类型 | 默认值 |
---|---|---|---|---|
data | 是 | 放置提交数据 | object | - |
config | 是 | 放置组件配置 | Array | - |
formKey | 否 | 自动本地缓存数据的localStorage的键,不传表示不缓存 | string | - |
className | 否 | 用来添加样式 | string | - |
assistData | 否 | 放置逻辑数据 | object | - |
realTimeSubmit | 否 | 表单是否实时提交,通常用于筛选表单 | boolean | false |
style | 否 | 控制表单组件了label和表单组件布局样式 | object | - |
style字段用来描述表单的布局样式,该字段既能够在表单配置下,针对全部的表单组件有效,也能够在组件配置下,只针对该表单组件有效,且能够覆盖表单配置下的style。缓存
{ formKey: 'test-form' ... style: { label: { fontSize: 12, width: 80, textAlign: 'left' }, wrap: { display: 'inline-block', width: 300 } } }
好比在该style下,显现出的表单是如下样子:异步
{ type: 'input', dataKey: 'name', label: 'param', placeholder: '请输入param', validate: ['required', /^[a-zA-Z_{}0-9]+$/g], style: { wrap: { display: 'inline-block', width: 270, } } }
属性 | 是否必传 | 说明 | 类型 | 默认值 |
---|---|---|---|---|
type | 是 | 惟一标识表单组件类型,其值能够为:input、select、textarea、form_array、container以及一些自定义表单组件 | string | - |
dataKey | 是 | 放置组件数据的key,能够为key1.key2.key3形式 | string | - |
label | 否 | 表单组件的label | string | - |
placeholder | 否 | 表单组件的placeholder | string | - |
validate | 否 | 表单组件的校验规则 | Array | - |
style | 否 | 表单组件的布局样式,同表单配置中的style | object | - |
options | 否 | 表单组件为select时,须要传入的options数据 | Array | - |
render | 否 | 当type为container(自定义组件)时,render为其渲染方法 | Function | - |
preventSubmit | 否 | 当realTimeSubmit为true时,preventSubmit控制该表单组件是否实时提交 | boolean | false |
children | 否 | 当type为form_array时,children表示子组件配置列表 | Array | 否 |
modifyDataFn | 否 | 当为自定义表单组件时,modifyDataFn能够覆盖render中提交数据的方法 | Function | 否 |
addItem | 否 | 当type为form_array时,点击添加增长一项时,组件数据增长的项 | object | - |
{ ... config: [ { type: 'input', dataKey: 'param.name', label: 'Param', placeholder: '请输入Param' } ] }
上面的组件配置渲染出一个最简单的表单组件,其效果以下:async
可是这个组件还缺乏了数据校验,如今为这个组件加上校验字段validate:布局
{ ... config: [ { type: 'input', ... validate: ['required', /^[a-zA-Z_{}0-9]+$/g] } ] }
如今这个表单组件就能校验该输入值不能为空,和只能为数字、字母、下划线。ui
JSON表单的数据校验和Ant Design、Element UI同样,采用async-validator
异步处理校验方案,在JSON表单内部,将传入validate字段解析为async-validator
的rules。其数组元素能够为String、Object、RegExp、Function。spa
1. 数组元素为string,其值能够为: string,值必须为string number,值必须为数字 required,值不能为空 boolean,值必须为布尔值 integer,值必须为整数形 float,值必须为浮点型 email,值必须为邮箱类型 2. 数组元素为object,其值为rules: {type: 'enum', enum: ['1', '2'], message: '值不在肯定范围内'} 3. 数组元素为RegExp, validate: [/^[a-zA-Z_{}0-9]+$/g] 4. 数组元素为Function, validate: [ (rules, value, callback) => {}]
目前JSON表单只支持五种表单组件,其中基础表单组件:input、select、textare。复杂表单组件:form_array、container。code
form_array组件主要是用来描述组件数据为数组格式的表单组件,其示例以下:orm
{ data: { value: [ { name: '', descr: '' } ] }, config: [ type: 'form_array', label: 'values', dataKey: 'value', addItem: { name: '', descr: '' }, children: [ // 组件配置 { type: 'input', dataKey: 'name', // dataKey是基于父表单组件 ... }, ... ] ] }
其效果图以下:
JSON表单的container表单组件请看下节:JSON生成Form表单(三)