From d07d16dded89f208c8cff262a4b04efd387e8b9a Mon Sep 17 00:00:00 2001 From: rzzf Date: Thu, 11 Dec 2025 06:06:31 +0800 Subject: [PATCH] perf(components): [tree] resolve memory leak occurring after data update (#23055) --- .../src/model/useNodeExpandEventBroadcast.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/components/tree/src/model/useNodeExpandEventBroadcast.ts b/packages/components/tree/src/model/useNodeExpandEventBroadcast.ts index 5a007352b3..7d5f051a66 100644 --- a/packages/components/tree/src/model/useNodeExpandEventBroadcast.ts +++ b/packages/components/tree/src/model/useNodeExpandEventBroadcast.ts @@ -1,11 +1,11 @@ -import { inject, provide } from 'vue' +import { inject, onBeforeUnmount, provide } from 'vue' import { TREE_NODE_MAP_INJECTION_KEY } from '../tokens' import type Node from '../model/node' interface NodeMap { treeNodeExpand(node?: Node): void - children: NodeMap[] + children: Set } interface Props { @@ -18,25 +18,32 @@ export function useNodeExpandEventBroadcast(props: Props) { TREE_NODE_MAP_INJECTION_KEY, null ) as NodeMap | null - const currentNodeMap: NodeMap = { + let currentNodeMap: NodeMap | null = { treeNodeExpand: (node) => { if (props.node !== node) { props.node?.collapse() } }, - children: [], + children: new Set(), } if (parentNodeMap) { - parentNodeMap.children.push(currentNodeMap) + parentNodeMap.children.add(currentNodeMap) } + onBeforeUnmount(() => { + if (parentNodeMap) { + parentNodeMap.children.delete(currentNodeMap!) + } + currentNodeMap = null + }) + provide(TREE_NODE_MAP_INJECTION_KEY, currentNodeMap) return { broadcastExpanded: (node?: Node): void => { if (!props.accordion) return - for (const childNode of currentNodeMap.children) { + for (const childNode of currentNodeMap!.children) { childNode.treeNodeExpand(node) } },