diff --git a/packages/designer/src/document/node/node-children.ts b/packages/designer/src/document/node/node-children.ts index 0dc6264f7..80f91b430 100644 --- a/packages/designer/src/document/node/node-children.ts +++ b/packages/designer/src/document/node/node-children.ts @@ -244,7 +244,7 @@ export class NodeChildren { return this.children.some((child, index) => fn(child, index)); } - filter(fn: (item: Node, index: number) => item is Node) { + filter(fn: (item: Node, index: number) => any) { return this.children.filter(fn); } diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 3b7c507e0..f34426092 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -793,11 +793,39 @@ export class Node { * @deprecated */ getSuitablePlace(node: Node, ref: any): any { - // TODO: - if (this.isRoot()) { + if (this.isRoot() && this.children) { + const dropElement = this.children.filter((c: Node) => { + if (!c.isContainer()) { + return false; + } + const canDropIn = c.componentMeta?.prototype?.options?.canDropIn; + if (typeof canDropIn === 'function') { + return canDropIn(node); + } else if (typeof canDropIn === 'boolean'){ + return canDropIn; + } + return true; + })[0]; + if (dropElement) { + return { container: dropElement, ref }; + } return { container: this, ref }; } - return { container: this.parent, ref: this }; + + const canDropIn = this.componentMeta?.prototype?.options?.canDropIn; + if (this.isContainer()) { + if (canDropIn === undefined || + (typeof canDropIn === 'boolean' && canDropIn) || + (typeof canDropIn === 'function' && canDropIn(node))){ + return { container: this, ref }; + } + } + + if (this.parent) { + return this.parent.getSuitablePlace(node, ref); + } + + return null; } /** * @deprecated @@ -813,9 +841,9 @@ export class Node { * @deprecated */ registerAddon(key: string, exportData: () => any, isProp: boolean = false) { - if (this._addons[key]) { - throw new Error(`node addon ${key} exist`); - } + // if (this._addons[key]) { + // throw new Error(`node addon ${key} exist`); + // } this._addons[key] = { exportData, isProp }; } diff --git a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts index aebbcbcbd..42ed2ad27 100644 --- a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts +++ b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts @@ -281,21 +281,24 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec } let initialFn = (slotName ? null : initial) || initialValue; - if (slotName && initialValue === true) { - initialFn = (value: any, defaultValue: any) => { - if (isJSSlot(value)) { - return { - title: slotTitle || title, - ...value, - }; - } - return { - type: 'JSSlot', - title: slotTitle || title, - value: initialChildren, - }; - }; - } + // 在 upgrade reducer 做了 JSBlock ——> JSSlot + // if (slotName && initialValue === true) { + // initialFn = (value: any, defaultValue: any) => { + // if (isJSSlot(value)) { + // return { + // title: slotTitle || title, + // name: slotName, + // ...value, + // }; + // } + // return { + // type: 'JSSlot', + // title: slotTitle || title, + // name: slotName, + // value: initialChildren, + // }; + // }; + // } if (!slotName) { if (accessor) { @@ -401,6 +404,7 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec return { type: 'JSSlot', title: slotTitle || title, + name: slotName, value: value == null ? initialChildren : value, }; }, diff --git a/packages/rax-simulator-renderer/package.json b/packages/rax-simulator-renderer/package.json index 047ee61a3..55525ae90 100644 --- a/packages/rax-simulator-renderer/package.json +++ b/packages/rax-simulator-renderer/package.json @@ -51,5 +51,5 @@ "ts-node/register" ] }, - "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@0.8.35/build/index.html" + "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@0.8.36/build/index.html" } diff --git a/packages/react-renderer/src/engine/base.jsx b/packages/react-renderer/src/engine/base.jsx index b2456deb4..775e77a9b 100644 --- a/packages/react-renderer/src/engine/base.jsx +++ b/packages/react-renderer/src/engine/base.jsx @@ -309,6 +309,8 @@ export default class BaseEngine extends PureComponent { if (scopeKey && this.__compScopes[scopeKey]) { props.__scope = this.__compScopes[scopeKey]; } + // FIXME 这里清除 key 是为了避免循环渲染中更改 key 导致的渲染重复 + props.key = ''; if (schema.__ctx && schema.__ctx.lunaKey) { if (!isFileSchema(schema)) { engine && engine.props.onCompGetCtx(schema, self); @@ -317,6 +319,7 @@ export default class BaseEngine extends PureComponent { } else if (typeof idx === 'number' && !props.key) { props.key = idx; } + props.__id = schema.id; const renderComp = (props) => { return engine.createElement(