diff --git a/CHANGELOG.md b/CHANGELOG.md index fe7fbdd9..5296cbeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.0.17 (2022-09-07) +- **core**: fix 不在树上的节点发起更新导致错误 + ## 0.0.16 (2022-09-07) - **core**: #56,#65 diff null 不能正确卸载组件 diff --git a/libs/horizon/package.json b/libs/horizon/package.json index b9b420bc..2bc5ecf0 100644 --- a/libs/horizon/package.json +++ b/libs/horizon/package.json @@ -4,7 +4,7 @@ "keywords": [ "horizon" ], - "version": "0.0.16", + "version": "0.0.17", "homepage": "", "bugs": "", "main": "index.js", 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;