diff --git a/libs/horizon/src/renderer/ErrorHandler.ts b/libs/horizon/src/renderer/ErrorHandler.ts index 3c3305c1..991ef861 100644 --- a/libs/horizon/src/renderer/ErrorHandler.ts +++ b/libs/horizon/src/renderer/ErrorHandler.ts @@ -71,7 +71,7 @@ export function handleRenderThrowError( // vNode抛出了异常,标记Interrupted中断 FlagUtils.markInterrupted(sourceVNode); // dirtyNodes 不再有效 - sourceVNode.dirtyNodes = []; + sourceVNode.dirtyNodes = null; // error是个promise if (error !== null && typeof error === 'object' && typeof error.then === 'function') { diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index 3c9b729b..9ff1cd0d 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -57,10 +57,20 @@ function resetProcessingVariables(startUpdateVNode: VNode) { // 收集有变化的节点,在submit阶段继续处理 function collectDirtyNodes(vNode: VNode, parent: VNode): void { // 将子树和此vNode的所有效果附加到父树的效果列表中,子项的完成顺序会影响副作用顺序。 - parent.dirtyNodes.push(...vNode.dirtyNodes); + if (vNode.dirtyNodes !== null && vNode.dirtyNodes.length) { + if (parent.dirtyNodes === null) { + parent.dirtyNodes = [...vNode.dirtyNodes]; + } else { + parent.dirtyNodes.push(...vNode.dirtyNodes); + } + } if (FlagUtils.hasAnyFlag(vNode)) { - parent.dirtyNodes.push(vNode); + if (parent.dirtyNodes === null) { + parent.dirtyNodes = [vNode]; + } else { + parent.dirtyNodes.push(vNode); + } } } diff --git a/libs/horizon/src/renderer/diff/nodeDiffComparator.ts b/libs/horizon/src/renderer/diff/nodeDiffComparator.ts index 797687b5..0d65c816 100644 --- a/libs/horizon/src/renderer/diff/nodeDiffComparator.ts +++ b/libs/horizon/src/renderer/diff/nodeDiffComparator.ts @@ -27,6 +27,10 @@ function isNoKeyFragment(child: any) { // 清除单个节点 function deleteVNode(parentNode: VNode, delVNode: VNode): void { FlagUtils.setDeletion(delVNode); + if (parentNode.dirtyNodes === null) { + parentNode.dirtyNodes = [delVNode]; + return; + } parentNode.dirtyNodes.push(delVNode); } diff --git a/libs/horizon/src/renderer/submit/Submit.ts b/libs/horizon/src/renderer/submit/Submit.ts index e222564f..7fccbe41 100644 --- a/libs/horizon/src/renderer/submit/Submit.ts +++ b/libs/horizon/src/renderer/submit/Submit.ts @@ -40,11 +40,15 @@ export function submitToRender(treeRoot) { if (FlagUtils.hasAnyFlag(startVNode)) { // 把自己加上 - startVNode.dirtyNodes.push(startVNode); + if (startVNode.dirtyNodes === null) { + startVNode.dirtyNodes = [startVNode]; + } else { + startVNode.dirtyNodes.push(startVNode); + } } const dirtyNodes = startVNode.dirtyNodes; - if (dirtyNodes.length) { + if (dirtyNodes !== null && dirtyNodes.length) { const preMode = copyExecuteMode(); changeMode(InRender, true); @@ -60,7 +64,7 @@ export function submitToRender(treeRoot) { // after submit阶段 afterSubmit(dirtyNodes); - setExecuteMode(preMode) + setExecuteMode(preMode); } if (isSchedulingEffects()) { diff --git a/libs/horizon/src/renderer/vnode/VNode.ts b/libs/horizon/src/renderer/vnode/VNode.ts index 0270165b..c875fe5a 100644 --- a/libs/horizon/src/renderer/vnode/VNode.ts +++ b/libs/horizon/src/renderer/vnode/VNode.ts @@ -35,7 +35,7 @@ export class VNode { suspenseChildStatus: string = ''; // Suspense的Children是否显示 depContexts: Array> | null = []; // FunctionComponent和ClassComponent对context的依赖列表 isDepContextChange: boolean = false; // context是否变更 - dirtyNodes: Array | null = []; // 需要改动的节点数组 + dirtyNodes: Array | null = null; // 需要改动的节点数组 shouldUpdate: boolean = false; childShouldUpdate: boolean = false; outerDom: any; diff --git a/libs/horizon/src/renderer/vnode/VNodeCreator.ts b/libs/horizon/src/renderer/vnode/VNodeCreator.ts index 40b5cc97..2d6d3bb2 100644 --- a/libs/horizon/src/renderer/vnode/VNodeCreator.ts +++ b/libs/horizon/src/renderer/vnode/VNodeCreator.ts @@ -78,7 +78,7 @@ export function updateVNode(vNode: VNode, vNodeProps?: any): VNode { vNode.oldRef = vNode.ref; FlagUtils.setNoFlags(vNode); - vNode.dirtyNodes = []; + vNode.dirtyNodes = null; vNode.isCreated = false; return vNode;