diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index 7bc0eece..2622bc4a 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -176,7 +176,12 @@ export function calcStartUpdateVNode(treeRoot: VNode) { } if (toUpdateNodes.length === 1) { - return toUpdateNodes[0]; + const toUpdateNode = toUpdateNodes[0]; + if (toUpdateNode.isCleared) { + return treeRoot; + } else { + return toUpdateNodes[0]; + } } // 要计算的节点过多,直接返回根节点 diff --git a/libs/horizon/src/renderer/vnode/VNode.ts b/libs/horizon/src/renderer/vnode/VNode.ts index 18b4d528..752c99cc 100644 --- a/libs/horizon/src/renderer/vnode/VNode.ts +++ b/libs/horizon/src/renderer/vnode/VNode.ts @@ -39,6 +39,8 @@ export class VNode { ref: RefType | ((handle: any) => void) | null = null; // 包裹一个函数,submit阶段使用,比如将外部useRef生成的对象赋值到ref上 oldProps: any = null; + // 是否已经被从树上移除 + isCleared = false; changeList: any; // DOM的变更列表 effectList: any[] | null; // useEffect 的更新数组 updates: any[] | null; // TreeRoot和ClassComponent使用的更新数组 diff --git a/libs/horizon/src/renderer/vnode/VNodeUtils.ts b/libs/horizon/src/renderer/vnode/VNodeUtils.ts index f3092976..789b8d2e 100644 --- a/libs/horizon/src/renderer/vnode/VNodeUtils.ts +++ b/libs/horizon/src/renderer/vnode/VNodeUtils.ts @@ -73,6 +73,7 @@ export function travelVNodeTree( // 置空vNode export function clearVNode(vNode: VNode) { + vNode.isCleared = true; vNode.child = null; vNode.next = null; vNode.depContexts = null;