ConditionalListPropertyPropType
export const ConditionalListPropertyPropType = (elementPropType) =>
PropTypes.arrayOf(
PropTypes.oneOfType([
elementPropType,
PredicateShape(elementPropType),
MatchableShape(elementPropType),
]),
);
ConditionalListPropertyPropType 只能接受数组,配置和 prop 原始的属性有关。
例如,如果 elementPropType 是 dataFilters,则 有如下 3 种配置方式
- 表示没有 conditional 的值,直接使用。
{
"dataFilters": [
{
"id": "status",
"type": "notEqual",
"value": "草稿"
}
]
}
- 表示当只有
matched匹配上的时候,才应用value,这种用法可以实现value根据几种不同的条件显示不同的值。如下例子表示只有当用户有 ROLE_EDIT 权限,并且不是开发的时候应用第一个 filter,当用户有 ROLE_EDIT 权限,并且是开发的时候应用第二个 filter。
{
"dataFilters": [
{
"value": {
"id": "status",
"type": "notEqual",
"value": "草稿"
},
"matched": {
"permissionPredicate": {
"hasAnyOf": [
"ROLE_EDIT"
]
},
"dataPredicate": {
"conditions": [
{
"field": ":context.userProfile.roles",
"condition": "notEqual",
"value": "开发"
}
]
}
}
},
{
"value": {
"id": "status",
"type": "equals",
"value": "草稿"
},
"matched": {
"permissionPredicate": {
"hasAnyOf": [
"ROLE_EDIT"
]
},
"dataPredicate": {
"conditions": [
{
"field": ":context.userProfile.roles",
"condition": "equals",
"value": "开发"
}
]
}
}
}
]
}
- 其实就是第 2 种
matched用法的简写方式,当你的value值是 2 选 1 的时候很好用。如下例子表示只有当用户有 ROLE_EDIT 权限,并且不是开发的时候,filter 的值是valueIfPositive,否则则是valueIfNegative
{
"dataFilters": [
{
"permissionPredicate": {
"hasAnyOf": [
"ROLE_EDIT"
]
},
"dataPredicate": {
"conditions": [
{
"field": ":context.userProfile.roles",
"condition": "notEqual",
"value": "开发"
}
]
},
"valueIfPositive": {
"id": "status",
"type": "equals",
"value": "草稿"
},
"valueIfNegative": {
"id": "status",
"type": "notEqual",
"value": "草稿"
}
}
]
}
例子里的 2 和 3 两种用法最终产生的 dataFilters 是基本一样的,区别是第 2 种用法的两个 dataFilters 都需要 ROLE_EDIT 权限,而第 3 种用法里没有 ROLE_EDIT 权限或者 roles 不是 开发 都会匹配到 dataFilters 的第二个 filter。
以上 3 种用法可以混合使用,比如可以在 dataFilters 数组里同时使用上面 3 种对象。