From 83664cd44019c3b5f05d2ad60bbb8fcf751f6b35 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 9 Dec 2025 15:51:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20getNode=20=E6=B7=BB=E5=8A=A0stict?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=9D=A5=E8=A1=A8=E7=A4=BA=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E7=9F=A5=E9=81=93=E9=A1=B5=E9=9D=A2=E7=89=87=E5=AE=B9=E5=99=A8?= =?UTF-8?q?id=E6=89=8D=E4=BC=9A=E8=BF=94=E5=9B=9E=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=86=85=E7=9A=84=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/EventHelper.ts | 4 ++-- packages/core/src/Node.ts | 2 +- packages/core/src/Page.ts | 8 +++++--- packages/core/src/type.ts | 2 ++ packages/data-source/src/createDataSourceManager.ts | 4 ++-- runtime/react-runtime-help/src/hooks/use-app.ts | 1 + runtime/tmagic-form/src/useFormConfig.ts | 4 ++-- runtime/vue-runtime-help/src/hooks/use-app.ts | 1 + runtime/vue-runtime-help/src/hooks/use-editor-dsl.ts | 4 ++-- 9 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/core/src/EventHelper.ts b/packages/core/src/EventHelper.ts index 4aea3fe6..ec420e86 100644 --- a/packages/core/src/EventHelper.ts +++ b/packages/core/src/EventHelper.ts @@ -279,13 +279,13 @@ export default class EventHelper extends EventEmitter { } const toNodes = []; - const toNode = this.app.getNode(to); + const toNode = this.app.getNode(to, { strict: true }); if (toNode) { toNodes.push(toNode); } for (const [, page] of this.app.pageFragments) { - const node = page.getNode(to); + const node = page.getNode(to, { strict: true }); if (node) { toNodes.push(node); } diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index 942ef1b0..e5d29fc8 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -191,7 +191,7 @@ class Node extends EventEmitter { if (this.app.eventHelper) { for (const eventConfig of this.app.eventHelper.getEventQueue()) { for (const [, page] of this.app.pageFragments) { - const node = page.getNode(eventConfig.toId); + const node = page.getNode(eventConfig.toId, { strict: true }); if (node && node === this) { if (typeof instance[eventConfig.method] === 'function') { await instance[eventConfig.method](eventConfig.fromCpt, ...eventConfig.args); diff --git a/packages/core/src/Page.ts b/packages/core/src/Page.ts index b6531dc2..2ea30e5f 100644 --- a/packages/core/src/Page.ts +++ b/packages/core/src/Page.ts @@ -84,14 +84,16 @@ class Page extends Node { public getNode( id: Id, - { iteratorContainerId, iteratorIndex, pageFragmentContainerId }: GetNodeOptions = {}, + { iteratorContainerId, iteratorIndex, pageFragmentContainerId, strict }: GetNodeOptions = {}, ): T | undefined { if (this.nodes.has(id)) { return this.nodes.get(id) as T; } if (pageFragmentContainerId) { - return this.app.pageFragments.get(pageFragmentContainerId)?.getNode(id, { iteratorContainerId, iteratorIndex }); + return this.app.pageFragments + .get(pageFragmentContainerId) + ?.getNode(id, { iteratorContainerId, iteratorIndex, strict: true }); } if (Array.isArray(iteratorContainerId) && iteratorContainerId.length && Array.isArray(iteratorIndex)) { @@ -107,7 +109,7 @@ class Page extends Node { return iteratorContainer?.getNode(id, iteratorIndex[iteratorIndex.length - 1]) as T; } - if (this.app.pageFragments.size) { + if (!strict && this.app.pageFragments.size) { for (const [, pageFragment] of this.app.pageFragments) { if (pageFragment.nodes.has(id)) { return pageFragment.nodes.get(id) as T; diff --git a/packages/core/src/type.ts b/packages/core/src/type.ts index d6a60eb3..ac6449d9 100644 --- a/packages/core/src/type.ts +++ b/packages/core/src/type.ts @@ -48,4 +48,6 @@ export interface GetNodeOptions { iteratorContainerId?: Id[]; iteratorIndex?: number[]; pageFragmentContainerId?: Id; + /** 严格模式,如果为true,页面片中的节点必须指定pageFragmentContainerId,为false时,没有pageFragmentContainerId的时候获得第一个页面片容器中的节点 */ + strict?: boolean; } diff --git a/packages/data-source/src/createDataSourceManager.ts b/packages/data-source/src/createDataSourceManager.ts index b6ed6cb8..43e63d9e 100644 --- a/packages/data-source/src/createDataSourceManager.ts +++ b/packages/data-source/src/createDataSourceManager.ts @@ -78,13 +78,13 @@ export const createDataSourceManager = (app: TMagicApp, useMock?: boolean, initi replaceChildNode(newNode, [app.page.data]); } - app.getNode(node.id)?.setData(newNode); + app.getNode(node.id, { strict: true })?.setData(newNode); for (const [, pageFragment] of app.pageFragments) { if (pageFragment.data.id === newNode.id) { pageFragment.setData(newNode); } else if (pageFragment.data.id === page.id) { - pageFragment.getNode(newNode.id)?.setData(newNode); + pageFragment.getNode(newNode.id, { strict: true })?.setData(newNode); if (!pageFragment.instance) { replaceChildNode(newNode, [pageFragment.data]); } diff --git a/runtime/react-runtime-help/src/hooks/use-app.ts b/runtime/react-runtime-help/src/hooks/use-app.ts index cd73c222..4f044a8b 100644 --- a/runtime/react-runtime-help/src/hooks/use-app.ts +++ b/runtime/react-runtime-help/src/hooks/use-app.ts @@ -47,6 +47,7 @@ export const useNode = ( iteratorContainerId: props.iteratorContainerId, iteratorIndex: props.iteratorIndex, pageFragmentContainerId: props.pageFragmentContainerId, + strict: true, }); } return void 0; diff --git a/runtime/tmagic-form/src/useFormConfig.ts b/runtime/tmagic-form/src/useFormConfig.ts index dcedaa37..c51a541d 100644 --- a/runtime/tmagic-form/src/useFormConfig.ts +++ b/runtime/tmagic-form/src/useFormConfig.ts @@ -82,7 +82,7 @@ export const useFormConfig = (props: AppProps) => { if (!parent) throw new Error('未找到父节点'); if (config.type !== 'page') { - const parentNode = app?.page?.getNode(parent.id); + const parentNode = app?.page?.getNode(parent.id, { strict: true }); parentNode && app?.page?.initNode(config, parentNode); } @@ -103,7 +103,7 @@ export const useFormConfig = (props: AppProps) => { const newNode = app.dataSourceManager?.compiledNode(config) || config; replaceChildNode(reactive(newNode), [root.value], parentId); - const nodeInstance = app.page?.getNode(config.id); + const nodeInstance = app.page?.getNode(config.id, { strict: true }); if (nodeInstance) { nodeInstance.setData(config); } diff --git a/runtime/vue-runtime-help/src/hooks/use-app.ts b/runtime/vue-runtime-help/src/hooks/use-app.ts index f905e450..95229d3b 100644 --- a/runtime/vue-runtime-help/src/hooks/use-app.ts +++ b/runtime/vue-runtime-help/src/hooks/use-app.ts @@ -43,6 +43,7 @@ export const useNode = ( iteratorContainerId: props.iteratorContainerId, iteratorIndex: props.iteratorIndex, pageFragmentContainerId: props.pageFragmentContainerId, + strict: true, }); } return void 0; diff --git a/runtime/vue-runtime-help/src/hooks/use-editor-dsl.ts b/runtime/vue-runtime-help/src/hooks/use-editor-dsl.ts index 9a892b12..459680a3 100644 --- a/runtime/vue-runtime-help/src/hooks/use-editor-dsl.ts +++ b/runtime/vue-runtime-help/src/hooks/use-editor-dsl.ts @@ -74,7 +74,7 @@ export const useEditorDsl = (app = inject('app'), win = window) => { if (!parent) throw new Error('未找到父节点'); if (config.type !== 'page') { - const parentNode = app?.page?.getNode(parent.id); + const parentNode = app?.page?.getNode(parent.id, { strict: true }); parentNode && app?.page?.initNode(config, parentNode); } @@ -99,7 +99,7 @@ export const useEditorDsl = (app = inject('app'), win = window) => { replaceChildNode(reactive(newNode), [root.value], parentId); - const nodeInstance = app.getNode(config.id); + const nodeInstance = app.getNode(config.id, { strict: true }); if (nodeInstance) { nodeInstance.setData(newNode); }