From: daiwei Date: Thu, 27 Mar 2025 05:43:08 +0000 (+0800) Subject: wip: refactor X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ab1a30a40de234e24ec8a91bb12a0b81921f62a;p=thirdparty%2Fvuejs%2Fcore.git wip: refactor --- diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts index 209bf13504..0b051420a5 100644 --- a/packages/runtime-vapor/src/component.ts +++ b/packages/runtime-vapor/src/component.ts @@ -60,11 +60,7 @@ import { import { hmrReload, hmrRerender } from './hmr' import { isHydrating, locateHydrationNode } from './dom/hydration' import { insertionAnchor, insertionParent } from './insertionState' -import { - type VaporTeleportImpl, - instanceToTeleportMap, - teleportStack, -} from './components/Teleport' +import type { VaporTeleportImpl } from './components/Teleport' export { currentInstance } from '@vue/runtime-dom' @@ -205,11 +201,6 @@ export function createComponent( ) if (__DEV__) { - let teleport = teleportStack[teleportStack.length - 1] - if (teleport) { - instanceToTeleportMap.set(instance, teleport) - } - pushWarningContext(instance) startMeasure(instance, `init`) diff --git a/packages/runtime-vapor/src/components/Teleport.ts b/packages/runtime-vapor/src/components/Teleport.ts index 1af56e65b5..c16d0b0634 100644 --- a/packages/runtime-vapor/src/components/Teleport.ts +++ b/packages/runtime-vapor/src/components/Teleport.ts @@ -10,44 +10,19 @@ import { } from '@vue/runtime-dom' import { type Block, type BlockFn, insert, remove } from '../block' import { createComment, createTextNode, querySelector } from '../dom/node' -import type { - LooseRawProps, - LooseRawSlots, - VaporComponentInstance, +import { + type LooseRawProps, + type LooseRawSlots, + type VaporComponentInstance, + isVaporComponent, } from '../component' import { rawPropsProxyHandlers } from '../componentProps' import { renderEffect } from '../renderEffect' import { extend, isArray } from '@vue/shared' import { VaporFragment } from '../fragment' -export const teleportStack: TeleportFragment[] = __DEV__ - ? ([] as TeleportFragment[]) - : (undefined as any) -export const instanceToTeleportMap: WeakMap< - VaporComponentInstance, - TeleportFragment -> = __DEV__ ? new WeakMap() : (undefined as any) - -/** - * dev only - * when the root child component updates, synchronously update - * the TeleportFragment's nodes. - */ -export function handleTeleportRootComponentHmrReload( - instance: VaporComponentInstance, - newInstance: VaporComponentInstance, -): void { - const teleport = instanceToTeleportMap.get(instance) - if (teleport) { - instanceToTeleportMap.set(newInstance, teleport) - if (teleport.nodes === instance) { - teleport.nodes = newInstance - } else if (isArray(teleport.nodes)) { - const i = teleport.nodes.indexOf(instance) - if (i !== -1) teleport.nodes[i] = newInstance - } - } -} +const instanceToTeleportMap: WeakMap = + __DEV__ ? new WeakMap() : (undefined as any) export const VaporTeleportImpl = { name: 'VaporTeleport', @@ -59,11 +34,9 @@ export const VaporTeleportImpl = { ? new TeleportFragment('teleport') : new TeleportFragment() - const updateChildrenEffect = renderEffect(() => { - __DEV__ && teleportStack.push(frag) - frag.updateChildren(slots.default && (slots.default as BlockFn)()) - __DEV__ && teleportStack.pop() - }) + const updateChildrenEffect = renderEffect(() => + frag.updateChildren(slots.default && (slots.default as BlockFn)()), + ) const updateEffect = renderEffect(() => { frag.update( @@ -138,6 +111,18 @@ class TeleportFragment extends VaporFragment { // mount new nodes insert((this.nodes = children), this.currentParent, this.currentAnchor) } + + if (__DEV__) { + if (isVaporComponent(children)) { + instanceToTeleportMap.set(children, this) + } else if (isArray(children)) { + children.forEach(node => { + if (isVaporComponent(node)) { + instanceToTeleportMap.set(node, this) + } + }) + } + } } update(props: TeleportProps): void { @@ -256,3 +241,24 @@ export const VaporTeleport = VaporTeleportImpl as unknown as { } } } + +/** + * dev only + * when the root child component updates, synchronously update + * the TeleportFragment's nodes. + */ +export function handleTeleportRootComponentHmrReload( + instance: VaporComponentInstance, + newInstance: VaporComponentInstance, +): void { + const teleport = instanceToTeleportMap.get(instance) + if (teleport) { + instanceToTeleportMap.set(newInstance, teleport) + if (teleport.nodes === instance) { + teleport.nodes = newInstance + } else if (isArray(teleport.nodes)) { + const i = teleport.nodes.indexOf(instance) + if (i !== -1) teleport.nodes[i] = newInstance + } + } +}