# 数据联动
要实现数据联动可以有多种方法来实现,也支持一些不基于 JSON Schema
规范的ui配置来实现,推荐优先使用基于JSON Schema规范的方案。
遵循 JSON Schema
规范包含如下几种方式:
通过UI配置的方式:
注意
在使用通过UI配置的方式时,可能打破 JSON Schema
规范,所以在使用时需要注意避免和 JSON Schema
描述的数据结构冲突。
比如:配置了
required
, 但ui-schema又配置了ui:hidden: true
,必须输入又不显示 ....
如果冲突因为生成的表单中会只校验显示的元素所以不会存在问题,但即使是表单通过了校验,数据结构也已经不在符合了,所以一定要避免....
# anyOf 实现数据联动
基于 JSON Schema anyOf (opens new window) 规范,详细anyOf配置可参考这里,适用于根据类型选择然后使用不同的数据结构或ui样式。
比如:设置个人资料可以通过 firstName
+ lastName
或者 通过 userId
两种方式来设置。如下演示:(点击 保存
按钮查看 formData
数据),也可以查看 其它anyOf在线演示 (opens new window)
- 推荐使用
anyOf
,oneOf
只能有一个符合的结果
# object dependencies 实现数据联动
基于 JSON Schema Object dependencies (opens new window) 规范,适用于根据需要根据值是否为空(undefined)来做联动设置,目前只支持 property dependencies。
支持 ui-schema
配置 onlyShowIfDependent: true
隐藏没触发依赖的项
比如:填写了 信用卡号
就必须填写 账单地址
。如下演示,也可以查看 Object-property-dependencies在线演示 (opens new window)
# if else 实现联动
暂不支持
基于 JSON Schema if then else (opens new window),适用于根据值等于一个常量时来做联动,目前版本不支持该特性。
就目前来看 if else 比较容易解决数据联动的场景,可以根据值来做判断,但依旧不能解决对值支持逻辑判断,比如大于
、小于
,后续版本会考虑支持该特性。
# ui-schema配置表达式
可能打破 JSON Schema
规范,配置思想来源 ali form-render (opens new window),通过对ui-schema ui:hidden
配置表达式。
ui:hidden实际不仅仅只支持表达式,详细的包含如下三种格式:
# ui:hidden mustache 表达式
mustache 表达式可使用 parentFormData
、rootFormData
两个内置变量。
parentFormData
当前节点父级的 FormData值rootFormData
根节点的 FormData值
配置表达式会通过
new Function
return 出结果,所以实际你在表达式中也可以访问到全局变量。
这样的配置都是可以的:
uiSchema = {
user: {
'ui:hidden': `{{ parentFormData.attr !== 'league' && rootFormData.case1.showMore === false }}`,
}
}
比如:需要根据某个值做逻辑判断来显示隐藏,也可以查看 uiSchema ui:hidden(联动)在线演示 (opens new window)
# ui:hidden function
function 和表达式类似,只是函数会更加灵活,函数接受 parentFormData
、rootFormData
两个参数。
parentFormData
当前节点父级的 FormData值rootFormData
根节点的 FormData值
如下配置:
uiSchema = {
user: {
'ui:hidden': (parentFormData, rootFormData) => {
return ...;
},
}
}
# ui:hidden 普通类型
- 普通类型,比如
true
false
都会被转Boolean
类型
# ui:field 调用自己的联级组件
可能打破 JSON Schema
规范,适用于通过配置一个已有的自定义组件来渲染一些复杂的联动场景
# ui-schema 动态样式
可能打破 JSON Schema
规范。ui-schema
和 formData
本身都是响应式数据,所以完全可以通过计算属性返回 ui-schema,配置 ui:widget:HiddenWidget
、ui:field: null
、 ui:fieldStyle
等都可以实现样式联动。
这个方法可以说是目前的下下策,会使得 ui-schema
配置存在大量的条件判断。