From 8a3a0b824162e25a930711c6fef511b4b369e897 Mon Sep 17 00:00:00 2001 From: "ruhuo.tan" Date: Thu, 19 May 2022 14:08:42 +0800 Subject: [PATCH] fix: fix setter hooks error --- .../designer/src/designer/setting/utils.ts | 27 ++++++++++++++----- packages/editor-core/src/di/setter.ts | 2 ++ packages/types/src/setter-config.ts | 2 ++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/designer/src/designer/setting/utils.ts b/packages/designer/src/designer/setting/utils.ts index b7c8fb4e5..01c2d9e39 100644 --- a/packages/designer/src/designer/setting/utils.ts +++ b/packages/designer/src/designer/setting/utils.ts @@ -1,8 +1,8 @@ // all this file for polyfill vision logic - import { isValidElement } from 'react'; -import { isSetterConfig, isDynamicSetter } from '@alilc/lowcode-types'; +import { isSetterConfig, isDynamicSetter, FieldConfig, SetterConfig } from '@alilc/lowcode-types'; import { getSetter } from '@alilc/lowcode-editor-core'; +import { SettingField } from './setting-field'; function getHotterFromSetter(setter) { return setter && (setter.Hotter || (setter.type && setter.type.Hotter)) || []; // eslint-disable-line @@ -35,7 +35,7 @@ export class Transducer { context: any; - constructor(context, config) { + constructor(context: SettingField, config: { setter: FieldConfig['setter'] }) { let { setter } = config; // 1. validElement @@ -46,16 +46,29 @@ export class Transducer { } else if (isValidElement(setter) && setter.type.displayName === 'MixedSetter') { setter = setter.props?.setters?.[0]; } else if (typeof setter === 'object' && setter.componentName === 'MixedSetter') { - setter = setter && setter.props && setter.props.setters && Array.isArray(setter.props.setters) && setter.props.setters[0]; + setter = Array.isArray(setter?.props?.setters) && setter.props.setters[0]; } + /** + * 两种方式标识是 FC 而不是动态 setter + * 1. 物料描述里面 setter 的配置,显式设置为 false + * 2. registerSetter 注册 setter 时显式设置为 false + */ + + let isDynamic = true; + if (isSetterConfig(setter)) { - setter = setter.componentName; + const { componentName, isDynamic: dynamicFlag } = setter as SetterConfig; + setter = componentName; + isDynamic = dynamicFlag !== false; } if (typeof setter === 'string') { - setter = getSetter(setter)?.component; + const { component, isDynamic: dynamicFlag } = getSetter(setter) || {}; + setter = component; + // 如果在物料配置中声明了,在 registerSetter 没有声明,取物料配置中的声明 + isDynamic = dynamicFlag === undefined ? isDynamic : dynamicFlag !== false; } - if (isDynamicSetter(setter)) { + if (isDynamicSetter(setter) && isDynamic) { setter = setter.call(context, context); } diff --git a/packages/editor-core/src/di/setter.ts b/packages/editor-core/src/di/setter.ts index 043d693cc..2dd350deb 100644 --- a/packages/editor-core/src/di/setter.ts +++ b/packages/editor-core/src/di/setter.ts @@ -15,6 +15,8 @@ export type RegisteredSetter = { */ initialValue?: any | ((field: any) => any); recommend?: boolean; + // 标识是否为动态setter,默认为true + isDynamic?: boolean; }; const settersMap = new Map