From 5dd5a506633efd3102f443b1cfda23870f17cfd9 Mon Sep 17 00:00:00 2001 From: * <8> Date: Tue, 22 Feb 2022 16:56:23 +0800 Subject: [PATCH] Match-id-c11e1befe0eb42e72a1ff5aeab9cd80718bdf2ae --- libs/horizon/src/renderer/TreeBuilder.ts | 2 +- libs/horizon/src/renderer/Types.ts | 2 +- .../src/renderer/components/CreatePortal.ts | 4 ++-- .../src/renderer/diff/nodeDiffComparator.ts | 4 ++-- .../src/renderer/render/BaseComponent.ts | 4 ++-- libs/horizon/src/renderer/render/DomPortal.ts | 4 ++-- libs/horizon/src/renderer/render/TreeRoot.ts | 2 +- .../src/renderer/submit/LifeCycleHandler.ts | 17 ++++------------- libs/horizon/src/renderer/vnode/VNode.ts | 6 ++---- libs/horizon/src/renderer/vnode/VNodeCreator.ts | 6 +++--- libs/horizon/src/renderer/vnode/VNodeUtils.ts | 4 ++-- 11 files changed, 22 insertions(+), 33 deletions(-) diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index 45b21eaa..7eca2c59 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -236,7 +236,7 @@ function buildVNodeTree(treeRoot: VNode) { // 当在componentWillUnmount中调用setState,parent可能是null,因为startVNode会被clear if (parent !== null) { resetNamespaceCtx(parent); - setNamespaceCtx(parent, parent.outerDom); + setNamespaceCtx(parent, parent.realNode); } // 恢复父节点的context diff --git a/libs/horizon/src/renderer/Types.ts b/libs/horizon/src/renderer/Types.ts index 9acbc42c..f95c4720 100644 --- a/libs/horizon/src/renderer/Types.ts +++ b/libs/horizon/src/renderer/Types.ts @@ -39,7 +39,7 @@ export type ContextType = { export type PortalType = { vtype: number; key: null | string; - outerDom: any; + realNode: any; children: any; }; diff --git a/libs/horizon/src/renderer/components/CreatePortal.ts b/libs/horizon/src/renderer/components/CreatePortal.ts index 38d30ca8..9e5e6a65 100644 --- a/libs/horizon/src/renderer/components/CreatePortal.ts +++ b/libs/horizon/src/renderer/components/CreatePortal.ts @@ -3,13 +3,13 @@ import type {PortalType} from '../Types'; export function createPortal( children: any, - outerDom: any, + realNode: any, key: string = '', ): PortalType { return { vtype: TYPE_PORTAL, key: key == '' ? '' : '' + key, children, - outerDom, + realNode, }; } diff --git a/libs/horizon/src/renderer/diff/nodeDiffComparator.ts b/libs/horizon/src/renderer/diff/nodeDiffComparator.ts index d3033570..f5cb03f9 100644 --- a/libs/horizon/src/renderer/diff/nodeDiffComparator.ts +++ b/libs/horizon/src/renderer/diff/nodeDiffComparator.ts @@ -153,7 +153,7 @@ function getNewNode(parentNode: VNode, newChild: any, oldNode: VNode | null) { } break; } else if (newChild.vtype === TYPE_PORTAL) { - if (oldNode === null || oldNode.tag !== DomPortal || oldNode.outerDom !== newChild.outerDom) { + if (oldNode === null || oldNode.tag !== DomPortal || oldNode.realNode !== newChild.realNode) { resultNode = createPortalVNode(newChild); } else { resultNode = updateVNode(oldNode, newChild.children || []); @@ -578,7 +578,7 @@ function diffObjectNodeHandler( } else if (newChild.vtype === TYPE_PORTAL) { if (canReuseNode) { // 可以复用 - if (canReuseNode.tag === DomPortal && canReuseNode.outerDom === newChild.outerDom) { + if (canReuseNode.tag === DomPortal && canReuseNode.realNode === newChild.realNode) { resultNode = updateVNode(canReuseNode, newChild.children || []); startDelVNode = canReuseNode.next; resultNode.next = null; diff --git a/libs/horizon/src/renderer/render/BaseComponent.ts b/libs/horizon/src/renderer/render/BaseComponent.ts index afedf488..c94d815d 100644 --- a/libs/horizon/src/renderer/render/BaseComponent.ts +++ b/libs/horizon/src/renderer/render/BaseComponent.ts @@ -18,7 +18,7 @@ import componentRenders from './index'; function handlerContext(processing: VNode) { switch (processing.tag) { case TreeRoot: - setNamespaceCtx(processing, processing.outerDom); + setNamespaceCtx(processing, processing.realNode); break; case DomComponent: setNamespaceCtx(processing); @@ -29,7 +29,7 @@ function handlerContext(processing: VNode) { break; } case DomPortal: - setNamespaceCtx(processing, processing.outerDom); + setNamespaceCtx(processing, processing.realNode); break; case ContextProvider: { const newValue = processing.props.value; diff --git a/libs/horizon/src/renderer/render/DomPortal.ts b/libs/horizon/src/renderer/render/DomPortal.ts index d3f79e58..baf4b500 100644 --- a/libs/horizon/src/renderer/render/DomPortal.ts +++ b/libs/horizon/src/renderer/render/DomPortal.ts @@ -7,12 +7,12 @@ export function bubbleRender(processing: VNode) { resetNamespaceCtx(processing); if (processing.isCreated) { - prePortal(processing.outerDom); + prePortal(processing.realNode); } } function capturePortalComponent(processing: VNode) { - setNamespaceCtx(processing, processing.outerDom); + setNamespaceCtx(processing, processing.realNode); const newElements = processing.props; if (processing.isCreated) { diff --git a/libs/horizon/src/renderer/render/TreeRoot.ts b/libs/horizon/src/renderer/render/TreeRoot.ts index 9b5eaa86..33a28402 100644 --- a/libs/horizon/src/renderer/render/TreeRoot.ts +++ b/libs/horizon/src/renderer/render/TreeRoot.ts @@ -12,7 +12,7 @@ export function bubbleRender(processing: VNode) { } function updateTreeRoot(processing) { - setNamespaceCtx(processing, processing.outerDom); + setNamespaceCtx(processing, processing.realNode); const updates = processing.updates; throwIfTrue( diff --git a/libs/horizon/src/renderer/submit/LifeCycleHandler.ts b/libs/horizon/src/renderer/submit/LifeCycleHandler.ts index 5d8d649a..adb21135 100644 --- a/libs/horizon/src/renderer/submit/LifeCycleHandler.ts +++ b/libs/horizon/src/renderer/submit/LifeCycleHandler.ts @@ -225,12 +225,9 @@ function submitAddition(vNode: VNode): void { let tag; while (parent !== null) { tag = parent.tag; - if (tag === DomComponent) { + if (tag === DomComponent || tag === TreeRoot || tag === DomPortal) { parentDom = parent.realNode; break; - } else if (tag === TreeRoot || tag === DomPortal) { - parentDom = parent.outerDom; - break; } parent = parent.parent; } @@ -292,12 +289,9 @@ function unmountDomComponents(vNode: VNode): void { let tag; while (parent !== null) { tag = parent.tag; - if (tag === DomComponent) { + if (tag === DomComponent || tag === TreeRoot || tag === DomPortal) { currentParent = parent.realNode; break; - } else if (tag === TreeRoot || tag === DomPortal) { - currentParent = parent.outerDom; - break; } parent = parent.parent; } @@ -312,7 +306,7 @@ function unmountDomComponents(vNode: VNode): void { removeChildDom(currentParent, node.realNode); } else if (node.tag === DomPortal) { if (node.child !== null) { - currentParent = node.outerDom; + currentParent = node.realNode; } } else { unmountVNode(node); @@ -349,12 +343,9 @@ function submitClear(vNode: VNode): void { let tag; while (parent !== null) { tag = parent.tag; - if (tag === DomComponent) { + if (tag === DomComponent || tag === TreeRoot || tag === DomPortal) { parentDom = parent.realNode; break; - } else if (tag === TreeRoot || tag === DomPortal) { - parentDom = parent.outerDom; - break; } parent = parent.parent; } diff --git a/libs/horizon/src/renderer/vnode/VNode.ts b/libs/horizon/src/renderer/vnode/VNode.ts index 129e54a8..b076a3eb 100644 --- a/libs/horizon/src/renderer/vnode/VNode.ts +++ b/libs/horizon/src/renderer/vnode/VNode.ts @@ -39,7 +39,6 @@ export class VNode { dirtyNodes: Array | null = null; // 需要改动的节点数组 shouldUpdate: boolean = false; childShouldUpdate: boolean = false; - outerDom: any; task: any; // 使用这个变量来记录修改前的值,用于恢复。 @@ -67,7 +66,7 @@ export class VNode { belongClassVNode: VNode | null = null; // 记录JSXElement所属class vNode,处理ref的时候使用 - constructor(tag: VNodeTag, props: any, key: null | string, outerDom) { + constructor(tag: VNodeTag, props: any, key: null | string, realNode) { this.tag = tag; // 对应组件的类型,比如ClassComponent等 this.key = key; @@ -75,10 +74,9 @@ export class VNode { switch (tag) { case TreeRoot: - this.outerDom = outerDom; + this.realNode = realNode; this.task = null; this.toUpdateNodes = new Set(); - this.realNode = null; this.updates = null; this.stateCallbacks = null; this.state = null; diff --git a/libs/horizon/src/renderer/vnode/VNodeCreator.ts b/libs/horizon/src/renderer/vnode/VNodeCreator.ts index 5305b13a..972a006f 100644 --- a/libs/horizon/src/renderer/vnode/VNodeCreator.ts +++ b/libs/horizon/src/renderer/vnode/VNodeCreator.ts @@ -38,8 +38,8 @@ const typeMap = { [TYPE_LAZY]: LazyComponent, }; -const newVirtualNode = function(tag: VNodeTag, key?: null | string, vNodeProps?: any, outerDom?: any): VNode { - return new VNode(tag, vNodeProps, key, outerDom); +const newVirtualNode = function(tag: VNodeTag, key?: null | string, vNodeProps?: any, realNode?: any): VNode { + return new VNode(tag, vNodeProps, key, realNode); }; function isClassComponent(comp: Function) { @@ -99,7 +99,7 @@ export function createPortalVNode(portal) { const children = portal.children ?? []; const vNode = newVirtualNode(DomPortal, portal.key, children); vNode.shouldUpdate = true; - vNode.outerDom = portal.outerDom; + vNode.realNode = portal.realNode; return vNode; } diff --git a/libs/horizon/src/renderer/vnode/VNodeUtils.ts b/libs/horizon/src/renderer/vnode/VNodeUtils.ts index a6521757..acda0b39 100644 --- a/libs/horizon/src/renderer/vnode/VNodeUtils.ts +++ b/libs/horizon/src/renderer/vnode/VNodeUtils.ts @@ -210,7 +210,7 @@ function isPortalRoot(vNode, targetContainer) { while (topVNode !== null) { const grandTag = topVNode.tag; if (grandTag === TreeRoot || grandTag === DomPortal) { - const topContainer = topVNode.outerDom; + const topContainer = topVNode.realNode; // 如果topContainer是targetContainer,不需要在这里处理 if (isSameContainer(topContainer, targetContainer)) { return true; @@ -229,7 +229,7 @@ export function getExactNode(targetVNode, targetContainer) { let vNode = targetVNode; while (vNode !== null) { if (vNode.tag === TreeRoot || vNode.tag === DomPortal) { - let container = vNode.outerDom; + let container = vNode.realNode; if (isSameContainer(container, targetContainer)) { break; }