sifo Form with ant-design-vue.
AntdVueFormModelPlugin 是在 SifoFormCore (@schema-plugin-flow/sifo-mplg-form-core) 基础上封装的UI层. mApi 同 SifoFormCore。
codesandbox.io: sifo-mplg-form-antdv
参数名 | 参数类型 | 描述 | 默认值 |
---|---|---|---|
formItemWrapper | (component)=>formItemWrapper | 对传入的components进行封装。结合SifoFormCore 封装的 ant-design-vue 下的 FormItem。可以自定义实现来满足需要的功能与特性 | defaultFormItemWrapper |
formItemProps | FormItemProps | 统一设置 FormItem 的属性,比如 labelCol、wrapperCol | {} |
详细示例与代码请参照github -> examples-vue/src/demos/form-demo
import SifoFormCore from '@schema-plugin-flow/sifo-mplg-form-core';
import AntdVueFormModelPlugin from "@schema-plugin-flow/sifo-mplg-form-antdv";
// 样式: @import "~@schema-plugin-flow/sifo-mplg-form-antdv/index.less";
// sifo plugins
[{
modelPlugin: {
plugin: SifoFormCore,
argsProvider: (mId, info) => {
return {
// 字段的key,无返回值认为不是字段,此处用 props.name 作为字段标识
fieldKey: (attr) => attr.props && attr.props.name,
fieldChange: {
// 表单字段change使用的handler
changeHandler: (context, e) => {
const { event, mApi } = context;
// 可根据不同的组件进行值获取
let val = e;
if (typeof e === "string" || typeof e === "number") {
val = e;
} else if (e && typeof e === "object") {
val = e.target ? e.target.value : e;
}
mApi.setAttributes(event.key, { value: val }, true);
},
eventName: "change", // antd-vue的字段组件事件名是 change
},
};
},
}
},
{
modelPlugin: AntdVueFormModelPlugin, // 要在SifoFormCore之后注册
},
/*
* 传 formItemProps 参数用法
modelPlugin: {
plugin: AntdVueFormModelPlugin,
argsProvider: (mId, info) => {
return {
formItemProps: {
labelCol: { span: 8 },
wrapperCol: { span: 16 }
}
};
}
}
*/
{ pagePlugin, componentPlugin }
]
SifoFormCore模型插件只有表单内核,不包含任何UI部分,UI可按各自的情形封装。
- 字段标识: 在字段节点时,在schema节点层和attributes层都将包含属性__isField__: true;
- vue 的 value, validators, rules, validateDisabled, validateInfo 等放在 attributes.props 上;
- 覆盖了 mApi.getFormItemProps 方法来适配 vue;
- 初始配置可将 value, rules 等放在 attributes 上; 运行时在 attributes.props 上;
- schema 节点 id 应与 fieldKey(此处指字段标识对应的值)一致;
- class 是字段组件的样式;itemClassName 是FormItem层的样式;
- labelCol 控制FormItem标签; wrapperCol 控制FormItem字段组件;
{
"id": "fieldKey01",
"component": "Input",
"attributes": {
"name": "fieldKey01",
"label": "字段名",
"rules": [
{
"required": true,
"message": "你需要填写项目的名称",
"trigger": [
"pressEnter",
"change"
]
}
],
"class": "test-control-class",
"itemClassName": "test-form-item-class",
"labelCol": {
"span": 8
},
"wrapperCol": {
"span": 16,
"offset": 0
}
}
}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 默认的字段标识key,不一定是“name”,可以是任意自定的key | string | - |
label | 字段标签名 | string | - |
hideLabel | 隐藏字段标签 | bool | false |
rules | 校验规则,见下文校验规则描述 | array | - |
itemVisible | 字段是否可见,即 display: none | bool | true |
itemClassName | FormItem 上的样式 | string | - |
labelCol | 字段标签对应的 Col 属性 | string | { span: 8 } |
wrapperCol | 字段组件对应的 Col 属性 | string | { span: 16 } |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
propsFormatter | 转换字段的属性到组件属性 | Function: (props: any) => any | - |
- 内置了必填、整数、最大最小值和长度校验;
- 规则描述的message省略时将使用内置文案;
- trigger 省略时将使用类实例参数 fieldChange 的 eventName,除非设置 notAutoTrigger = true,此时只在调用 validate、validateAll 时触发;
- 调用validate、validateAll 时不区分 trigger;
{
"rules": [
{
"required": true,
"message": "请填写信息",
"trigger": [
"pressEnter",
"change"
]
},
{
"type": "integer"
},
{
"max": 99.9
},
{
"maxLength": 9
}
]
}
方法名 | 参数/类型 | 返回值类型 | 描述 |
---|---|---|---|
getFormItemProps | id | { value, validators, defaultValue, rules, validateDisabled, validateInfo } | 此方法应返回FormItem的属性,包含:value, validators, rules, validateDisabled, validateInfo 等,默认在attributes中取(即使用 getAttributes 方法)。后面的模型插件可覆盖此方法来适配相应情形。 |
setValue | (fieldKey, value) | - | 设置指定字段的值 |
setValues | { [fieldKey]: value } | - | 设置多个字段值 |
getValue | fieldKey | any | 获取指定字段值 |
getValues | ✘ | { [fieldKey]: value } | 获取所有字段值 |
setRules | (id, rules, setType = 'merge', refresh) | Promise | 设置校验规则,默认用 merge 模式,用 replace 模式时,会完全替换成设置的规则 |
addValidator | (fieldKey, validatorItem) | - | 为指定字段增加函数式校验器,要注意校验器的使用方法,见下面的validatorItem示例 |
removeValidator | (fieldKey, validatorItem) | - | 移除函数式校验器 |
disableValidate | (fieldKey, disable = true) | - | 设置校验(包含校验规则与校验函数)是否失效 |
validate | fieldKey | Promise< validateInfo: { passed, message }[] > | 校验指定字段 |
validateAll | ✘ | Promise< { passed, details:{ id, fieldKey, validateInfo, passed }[] }[] > | 校验所有字段 |
scrollIntoView | fieldKey | - | 滚动到指定字段位置 |
validatorItem
const validatorItem = {
validator: (value, callback, opts:{ id, mApi, fieldKey }) => {
// not passed
callback({
passed: false,
status: 'error',
message: 'invalidate message',
});
// passed
callback();
},
trigger: ['eventName'], // 在何时触发,默认是类实例参数 fieldChange 的 eventName
}