From 1bb0478883255d4d7b7ed99f425970a93d7800ff Mon Sep 17 00:00:00 2001 From: 13659257719 <819781841@qq.com> Date: Thu, 12 Oct 2023 15:56:45 +0800 Subject: [PATCH] =?UTF-8?q?[inula]=20=E5=A4=A7=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BD=BF=E7=94=A8=20concat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/inula/src/renderer/TreeBuilder.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/inula/src/renderer/TreeBuilder.ts b/packages/inula/src/renderer/TreeBuilder.ts index dff56e07..50326e25 100644 --- a/packages/inula/src/renderer/TreeBuilder.ts +++ b/packages/inula/src/renderer/TreeBuilder.ts @@ -55,6 +55,9 @@ import { getPathArr } from './utils/vNodePath'; import { injectUpdater } from '../external/devtools'; import { popCurrentRoot, pushCurrentRoot } from './RootStack'; +// 使用 push 扩展语法合并数组场景下被合并数组元素的上限(经验值) +const MAX_NUM_PUSH_MERGE_ARRAY = 1000; + // 不可恢复错误 let unrecoverableErrorDuringBuild: any = null; @@ -81,7 +84,12 @@ function collectDirtyNodes(vNode: VNode, parent: VNode): void { if (parent.dirtyNodes === null) { parent.dirtyNodes = dirtyNodes; } else { - parent.dirtyNodes.push(...vNode.dirtyNodes!); + // 超过上限继续使用 push 方法合并数组将导致性能劣化/调用栈溢出 + if (dirtyNodes.length > MAX_NUM_PUSH_MERGE_ARRAY) { + parent.dirtyNodes = parent.dirtyNodes.concat(dirtyNodes); + } else { + parent.dirtyNodes.push(...dirtyNodes); + } dirtyNodes.length = 0; } vNode.dirtyNodes = null;