alibaba / alibaba/lowcode-engine
支持控制MixedSetter默认选中setter
- Dominant language
- TypeScript
- Stars
- 15.9k
- Forks
- 2.7k
- PR merge metrics
- No merged PRs in 30d
Description
# 背景
我在给antd table配置`shouldUpdate`属性, 这个属性支持boolean 和 函数, 但大部分情况下用户会使用函数类型的props.
所以我希望优先使用FunctionSetter, 物料meta.js:
``` js
{
name: 'shouldUpdate',
title: {
label: '自定义更新',
tip: 'shouldUpdate | 自定义更新函数',
},
setter: {
componentName: 'MixedSetter',
props: {
setters: [
{
componentName: 'FunctionSetter',
props: {},
},
{
componentName: 'BoolSetter',
},
],
},
},
},
```
但结果是, 在属性面板首次渲染时展示的是 BoolSetter
原因是, getCurrentSetter (在`lowcode-engine-ext/src/setter/mixed-setter/index.tsx`)
``` ts
private getCurrentSetter() {
const { field } = this.props;
let firstMatched: SetterItem | undefined;
let firstDefault: SetterItem | undefined;
for (const setter of this.setters) {
if (setter.name === this.used) {
return setter;
}
if (!setter.condition) {
if (!firstDefault) {
firstDefault = setter;
}
continue;
}
if (!firstMatched && setter.condition(field)) {
firstMatched = setter;
}
}
return firstMatched || firstDefault || this.setters[0];
}
```
FunctionSetter是带有`condition`的, 但是首次渲染时候,field没有值,所以上面的这段代码`if (!firstMatched && setter.condition(field))`就返回false。而BoolSetter由于没`condition` 被设为`firstDefault`
``` tsx
const FunctionBindSetter = {
component: FunctionSetter,
title: '函数绑定',
condition: (field: any) => {
const v = field.getValue();
return isJSFunction(v);
},
valueType: ['JSFunction'],
};
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.