diff --git a/packages/types/src/metadata.ts b/packages/types/src/metadata.ts index bb8d7da34..77476d758 100644 --- a/packages/types/src/metadata.ts +++ b/packages/types/src/metadata.ts @@ -47,7 +47,7 @@ export interface InitialItem { } export interface FilterItem { name: string; - filter: (target: SettingTarget, currentValue: any) => any; + filter: (target: SettingTarget | null, currentValue: any) => any; } export interface AutorunItem { name: string; diff --git a/packages/vision-polyfill/src/props-reducers/filter-empty-event.ts b/packages/vision-polyfill/src/props-reducers/filter-empty-event.ts new file mode 100644 index 000000000..0fc6aa801 --- /dev/null +++ b/packages/vision-polyfill/src/props-reducers/filter-empty-event.ts @@ -0,0 +1,20 @@ +import { Node } from '@ali/lowcode-engine'; +import { hasOwnProperty, isPlainObject } from '@ali/lowcode-utils'; + +function isEmptyEvent(event: any) { + return event?.ignored === true; +} + +/** + * 在使用老版的 vu-events-property,会有空的事件描述,比如 onClick: { ignored: true } 的情况 + */ +export function filterEmptyEventReducer(props: any, node: Node): any { + if (!props || !isPlainObject(props)) return props; + // 基于性能考虑,只过滤第一层 + Object.keys(props).forEach(name => { + if (name.startsWith('on') && isEmptyEvent(props[name])) { + delete props[name]; + } + }); + return props; +} diff --git a/packages/vision-polyfill/src/props-reducers/filter-reducer.ts b/packages/vision-polyfill/src/props-reducers/filter-reducer.ts index eaa3d6bc4..0239ab102 100644 --- a/packages/vision-polyfill/src/props-reducers/filter-reducer.ts +++ b/packages/vision-polyfill/src/props-reducers/filter-reducer.ts @@ -3,9 +3,9 @@ import { Node, PropsReducerContext, designerCabin, engineConfig } from '@ali/low import { hasOwnProperty } from '@ali/lowcode-utils'; const { TransformStage } = designerCabin; -export function filterReducer(props: any, node: Node, ctx: PropsReducerContext): any { +export function filterReducer(props: any, node: Node, ctx?: PropsReducerContext): any { // 老的 vision 逻辑是 render 阶段不走 filter 逻辑 - if (ctx.stage === TransformStage.Render && !engineConfig.get('visionSettings.enableFilterReducerInRenderStage', false)) { + if (ctx?.stage === TransformStage.Render && !engineConfig.get('visionSettings.enableFilterReducerInRenderStage', false)) { return props; } const filters = node.componentMeta.getMetadata().experimental?.filters; diff --git a/packages/vision-polyfill/src/props-reducers/index.ts b/packages/vision-polyfill/src/props-reducers/index.ts index 2684f6b96..dd5a5e888 100644 --- a/packages/vision-polyfill/src/props-reducers/index.ts +++ b/packages/vision-polyfill/src/props-reducers/index.ts @@ -7,3 +7,4 @@ export * from './style-reducer'; export * from './upgrade-reducer'; export * from './node-top-fixed-reducer'; export * from './reset-loop-default-value-reducer'; +export * from './filter-empty-event'; diff --git a/packages/vision-polyfill/src/reducers.ts b/packages/vision-polyfill/src/reducers.ts index 1df10fbf2..0a2c67682 100644 --- a/packages/vision-polyfill/src/reducers.ts +++ b/packages/vision-polyfill/src/reducers.ts @@ -15,6 +15,7 @@ import { liveLifecycleReducer, nodeTopFixedReducer, resetLoopDefaultValueReducer, + filterEmptyEventReducer, } from './props-reducers'; const { LiveEditing, TransformStage } = designerCabin; @@ -41,6 +42,9 @@ designer.addPropsReducer(liveLifecycleReducer, TransformStage.Render); designer.addPropsReducer(filterReducer, TransformStage.Save); designer.addPropsReducer(filterReducer, TransformStage.Render); +designer.addPropsReducer(filterEmptyEventReducer, TransformStage.Save); +designer.addPropsReducer(filterEmptyEventReducer, TransformStage.Render); + // FIXME: Dirty fix, will remove this reducer designer.addPropsReducer(compatibleReducer, TransformStage.Save); // 兼容历史版本的 Page 组件