From 688166678a29e54cce980f555af00df623fba518 Mon Sep 17 00:00:00 2001 From: * <8> Date: Sun, 30 Jan 2022 16:31:20 +0800 Subject: [PATCH] Match-id-d45c18e68360b98d3fd778277879bbbb0f141272 --- .../src/event/customEvents/CustomBaseEvent.ts | 6 ++- libs/horizon/src/renderer/GlobalVar.ts | 2 +- libs/horizon/src/renderer/TreeBuilder.ts | 39 +++++++------------ .../src/renderer/submit/HookEffectHandler.ts | 9 +---- libs/horizon/src/renderer/submit/Submit.ts | 12 ------ libs/horizon/src/renderer/vnode/VNodeFlags.ts | 6 +-- .../src/renderer/vnode/VNodeShouldUpdate.ts | 1 + libs/horizon/src/renderer/vnode/VNodeUtils.ts | 3 +- 8 files changed, 27 insertions(+), 51 deletions(-) diff --git a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts index e58b91c4..3725c9c0 100644 --- a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts +++ b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts @@ -35,9 +35,11 @@ function extendAttribute(target, source) { ]; const length = attributes.length; + let attr; + let type; for (let i = 0; i < length; i++) { - const attr = attributes[i]; - const type = source[attr]; + attr = attributes[i]; + type = source[attr]; if (type !== 'undefined') { if (type === 'function') { target[attr] = function() { diff --git a/libs/horizon/src/renderer/GlobalVar.ts b/libs/horizon/src/renderer/GlobalVar.ts index e7ea335c..44911e69 100644 --- a/libs/horizon/src/renderer/GlobalVar.ts +++ b/libs/horizon/src/renderer/GlobalVar.ts @@ -1,6 +1,6 @@ import type {VNode} from './Types'; -// 当前处理的classVNode,用于inst.refs用法中的 +// 当前处理的classVNode,用于设置inst.refs let processingClassVNode: VNode | null = null; export function getProcessingClassVNode(): VNode | null { return processingClassVNode; diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index ff7dd150..fb7a85f3 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -10,7 +10,7 @@ import { runAsyncEffects } from './submit/HookEffectHandler'; import { handleRenderThrowError } from './ErrorHandler'; import componentRenders from './render'; import { - BuildCompleted, BuildErrored, + BuildCompleted, BuildFatalErrored, BuildInComplete, getBuildResult, getStartVNode, @@ -36,12 +36,11 @@ import { updateShouldUpdateOfTree } from './vnode/VNodeShouldUpdate'; -// 当前运行的vNode节点 -let processing: VNode | null = null; - // 不可恢复错误 let unrecoverableErrorDuringBuild: any = null; +// 当前运行的vNode节点 +let processing: VNode | null = null; export function setProcessing(vNode: VNode | null) { processing = vNode; } @@ -64,7 +63,7 @@ function collectDirtyNodes(vNode: VNode, parent: VNode): void { } } -// ============================== 向上递归 ============================== +// ============================== 向上冒泡 ============================== // 尝试完成当前工作单元,然后移动到下一个兄弟工作单元。如果没有更多的同级,请返回父vNode。 function bubbleVNode(vNode: VNode): void { @@ -201,18 +200,18 @@ function buildVNodeTree(treeRoot: VNode) { changeMode(InRender, true); // 计算出开始节点 - const startUpdateVNode = calcStartUpdateVNode(treeRoot); + const startVNode = calcStartUpdateVNode(treeRoot); // 缓存起来 - setStartVNode(startUpdateVNode); + setStartVNode(startVNode); // 清空toUpdateNodes treeRoot.toUpdateNodes.clear(); - if (startUpdateVNode.tag !== TreeRoot) { // 不是根节点 + if (startVNode.tag !== TreeRoot) { // 不是根节点 // 设置namespace,用于createElement - const parentObj = findDomParent(startUpdateVNode); + const parentObj = findDomParent(startVNode); - // 当在componentWillUnmount中调用setState,parent可能是null,因为startUpdateVNode会被clear + // 当在componentWillUnmount中调用setState,parent可能是null,因为startVNode会被clear if (parentObj !== null) { const domParent = parentObj.parent; resetNamespaceCtx(domParent); @@ -220,20 +219,20 @@ function buildVNodeTree(treeRoot: VNode) { } // 恢复父节点的context - recoverParentsContextCtx(startUpdateVNode); + recoverParentsContextCtx(startVNode); } // 重置环境变量,为重新进行深度遍历做准备 - resetProcessingVariables(startUpdateVNode); + resetProcessingVariables(startVNode); - do { + while (processing !== null) { try { while (processing !== null) { // 捕获创建 vNodes const next = captureVNode(processing); if (next === null) { - // 如果没有产生新的,那么就完成当前节点,向上遍历 + // 如果没有子节点,那么就完成当前节点,开始冒泡 bubbleVNode(processing); } else { processing = next; @@ -241,14 +240,10 @@ function buildVNodeTree(treeRoot: VNode) { } setProcessingClassVNode(null); - - break; } catch (thrownValue) { handleError(treeRoot, thrownValue); } - } while (true); - - processing = null; + } setExecuteMode(preMode); } @@ -313,12 +308,6 @@ export function launchUpdateFromVNode(vNode: VNode) { } } -export function setBuildResultError() { - if (getBuildResult() !== BuildCompleted) { - setBuildResult(BuildErrored); - } -} - // ============================== HorizonDOM使用 ============================== export function runDiscreteUpdates() { if (checkMode(ByAsync) || checkMode(InRender)) { diff --git a/libs/horizon/src/renderer/submit/HookEffectHandler.ts b/libs/horizon/src/renderer/submit/HookEffectHandler.ts index 36344ff3..c66675ca 100644 --- a/libs/horizon/src/renderer/submit/HookEffectHandler.ts +++ b/libs/horizon/src/renderer/submit/HookEffectHandler.ts @@ -14,8 +14,6 @@ import {runAsync} from '../taskExecutor/TaskExecutor'; import { copyExecuteMode, InRender, setExecuteMode,changeMode } from '../ExecuteMode'; -import {handleSubmitError} from '../ErrorHandler'; -import {clearDirtyNodes} from './Submit'; import {EffectConstant} from '../hooks/EffectConstant'; let hookEffects: Array = []; @@ -81,7 +79,7 @@ export function runAsyncEffects() { try { destroy(); } catch (error) { - handleSubmitError(vNode, error); + // 不处理副作用阶段抛出的异常 } } }); @@ -95,13 +93,10 @@ export function runAsyncEffects() { effect.removeEffect = create(); } catch (error) { - handleSubmitError(vNode, error); + // 不处理副作用阶段抛出的异常 } }); - // 清理dirtyNodes - clearDirtyNodes(root.dirtyNodes); - setExecuteMode(preMode); callRenderQueueImmediate(); diff --git a/libs/horizon/src/renderer/submit/Submit.ts b/libs/horizon/src/renderer/submit/Submit.ts index b7eaa86c..fe1018c3 100644 --- a/libs/horizon/src/renderer/submit/Submit.ts +++ b/libs/horizon/src/renderer/submit/Submit.ts @@ -70,8 +70,6 @@ export function submitToRender(treeRoot) { // 记录root,说明这个root有副作用要执行 setHookEffectRoot(treeRoot); - } else { - clearDirtyNodes(dirtyNodes); } // 统计root同步重渲染的次数,如果太多可能是无线循环 @@ -197,13 +195,3 @@ export function checkLoopingUpdateLimit() { ); } } - -// 清理dirtyNodes -export function clearDirtyNodes(dirtyNodes) { - dirtyNodes.forEach(node => { - if (node.flags.Deletion) { - node.realNode = null; - node.next = null; - } - }); -} diff --git a/libs/horizon/src/renderer/vnode/VNodeFlags.ts b/libs/horizon/src/renderer/vnode/VNodeFlags.ts index 494d93fa..48d0331d 100644 --- a/libs/horizon/src/renderer/vnode/VNodeFlags.ts +++ b/libs/horizon/src/renderer/vnode/VNodeFlags.ts @@ -41,8 +41,9 @@ export class FlagUtils { static hasAnyFlag(node: VNode) { // 有标志位 const flags = node.flags; const arrLength = FlagArr.length; - for(let i = 0; i < arrLength; i++) { - const key = FlagArr[i]; + let key; + for (let i = 0; i < arrLength; i++) { + key = FlagArr[i]; if (flags[key]) { return true; } @@ -92,7 +93,6 @@ export class FlagUtils { static markForceUpdate(node: VNode) { node.flags.ForceUpdate = true; } - static markClear(node: VNode) { node.flags.Clear = true; } diff --git a/libs/horizon/src/renderer/vnode/VNodeShouldUpdate.ts b/libs/horizon/src/renderer/vnode/VNodeShouldUpdate.ts index 8dfe8c7e..72afb236 100644 --- a/libs/horizon/src/renderer/vnode/VNodeShouldUpdate.ts +++ b/libs/horizon/src/renderer/vnode/VNodeShouldUpdate.ts @@ -56,6 +56,7 @@ export function updateParentsChildShouldUpdate(vNode: VNode) { let isShouldUpdate = vNode.shouldUpdate || vNode.childShouldUpdate; if (isShouldUpdate) { // 开始节点是shouldUpdate或childShouldUpdate + // 更新从当前节点到根节点的childShouldUpdate为true setParentsChildShouldUpdate(node); } else { while (node !== null) { diff --git a/libs/horizon/src/renderer/vnode/VNodeUtils.ts b/libs/horizon/src/renderer/vnode/VNodeUtils.ts index 09ff6f0e..92407f1b 100644 --- a/libs/horizon/src/renderer/vnode/VNodeUtils.ts +++ b/libs/horizon/src/renderer/vnode/VNodeUtils.ts @@ -81,7 +81,6 @@ export function clearVNode(vNode: VNode) { vNode.next = null; vNode.depContexts = []; vNode.dirtyNodes = []; - vNode.oldProps = null; vNode.state = null; vNode.hooks = []; vNode.suspenseChildStatus = ''; @@ -91,7 +90,9 @@ export function clearVNode(vNode: VNode) { vNode.changeList = null; vNode.effectList = []; vNode.updates = null; + vNode.realNode = null; + vNode.oldProps = null; vNode.oldHooks = []; vNode.oldState = null; vNode.oldRef = null;