From 3410a9cc0047e2f6431ae6a6cbe65d0b277518c0 Mon Sep 17 00:00:00 2001 From: * <8> Date: Thu, 17 Feb 2022 11:34:11 +0800 Subject: [PATCH] Match-id-2a4d49b90b105db41f89732a409a878541bd1263 --- .../src/renderer/components/context/Context.ts | 12 +++++++----- libs/horizon/src/renderer/render/ContextProvider.ts | 2 +- libs/horizon/src/renderer/vnode/VNode.ts | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libs/horizon/src/renderer/components/context/Context.ts b/libs/horizon/src/renderer/components/context/Context.ts index bcbc4f83..4052a0ed 100644 --- a/libs/horizon/src/renderer/components/context/Context.ts +++ b/libs/horizon/src/renderer/components/context/Context.ts @@ -4,17 +4,19 @@ import {throwNotInFuncError} from '../../hooks/BaseHook'; // 重置依赖 export function resetDepContexts(vNode: VNode): void { - vNode.depContexts = []; + vNode.depContexts = null; } // 收集依赖 function collectDeps(vNode: VNode, context: ContextType) { const depContexts = vNode.depContexts; - if (!depContexts.length) { + if (depContexts === null) { + vNode.depContexts = [context]; + } else { vNode.isDepContextChange = false; - } - if (!depContexts.includes(context)) { - depContexts.push(context); + if (!depContexts.includes(context)) { + depContexts.push(context); + } } } diff --git a/libs/horizon/src/renderer/render/ContextProvider.ts b/libs/horizon/src/renderer/render/ContextProvider.ts index c31a9ff4..c3c287d8 100644 --- a/libs/horizon/src/renderer/render/ContextProvider.ts +++ b/libs/horizon/src/renderer/render/ContextProvider.ts @@ -50,7 +50,7 @@ function handleContextChange(processing: VNode, context: ContextType): void // 从vNode开始遍历 travelVNodeTree(vNode, node => { const depContexts = node.depContexts; - if (depContexts.length) { + if (depContexts && depContexts.length) { isMatch = matchDependencies(depContexts, context, node) ?? isMatch; } }, node => diff --git a/libs/horizon/src/renderer/vnode/VNode.ts b/libs/horizon/src/renderer/vnode/VNode.ts index 25b12511..8ce6d94b 100644 --- a/libs/horizon/src/renderer/vnode/VNode.ts +++ b/libs/horizon/src/renderer/vnode/VNode.ts @@ -33,7 +33,7 @@ export class VNode { state: any = null; // ClassComponent和TreeRoot的状态 hooks: Array> | null = null; // 保存hook suspenseChildStatus: string = ''; // Suspense的Children是否显示 - depContexts: Array> | null = []; // FunctionComponent和ClassComponent对context的依赖列表 + depContexts: Array> | null = null; // FunctionComponent和ClassComponent对context的依赖列表 isDepContextChange: boolean = false; // context是否变更 dirtyNodes: Array | null = null; // 需要改动的节点数组 shouldUpdate: boolean = false;