@schema-plugin-flow/sifo-mplg-form-antdv
v1.12.0
Published
sifo Form with ant-design-vue.
Downloads
10
Maintainers
Readme
AntdVueFormModelPlugin
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 }
]
formItemWrapper
SifoFormCore模型插件只有表单内核,不包含任何UI部分,UI可按各自的情形封装。
- 字段标识: 在字段节点时,在schema节点层和attributes层都将包含属性__isField__: true;
- vue 的 value, validators, rules, validateDisabled, validateInfo 等放在 attributes.props 上;
- 覆盖了 mApi.getFormItemProps 方法来适配 vue;
schema 格式
- 初始配置可将 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
}
}
}
FormItem Props
| 参数 | 说明 | 类型 | 默认值 | | -------------------- | ------------ | -------- | ---------------- | | name | 默认的字段标识key,不一定是“name”,可以是任意自定的key | string | - | | label | 字段标签名 | string | - | | hideLabel | 隐藏字段标签 | bool | false | | rules | 校验规则,见下文校验规则描述 | array | - | | itemVisible | 字段是否可见,即 display: none | bool | true | | itemClassName | FormItem 上的样式 | string | - | | labelAlign | 标签位置布局方式: 上下(top)、左右(left) | 'left'/'top' | 'left' | | labelTextAlign | 标签文字对齐方式: 左(left)、右(right) | 'left'/'right' | 'right' | | labelCol | 字段标签对应的 Col 属性 | string | { span: 8 } | | wrapperCol | 字段组件对应的 Col 属性 | string | { span: 16 } |
FormItem 事件
| 参数 | 说明 | 类型 | 默认值 | | -------------------- | ------------ | -------- | ---------------- | | 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
}
]
}
扩展的 mApi 模型接口
| 方法名 | 参数/类型 | 返回值类型 | 描述 | | ---------------- | -----------------------| --------------------- | ---------------------------------------------------------------------------------------------------| | 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
}