From: edison Date: Mon, 29 Dec 2025 06:24:14 +0000 (+0800) Subject: refactor(runtime-vapor): simplify hydration state management (#14259) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fminor;p=thirdparty%2Fvuejs%2Fcore.git refactor(runtime-vapor): simplify hydration state management (#14259) --- diff --git a/packages/runtime-vapor/src/dom/hydration.ts b/packages/runtime-vapor/src/dom/hydration.ts index 881713815..6214904e3 100644 --- a/packages/runtime-vapor/src/dom/hydration.ts +++ b/packages/runtime-vapor/src/dom/hydration.ts @@ -25,29 +25,27 @@ import { import { findBlockNode, remove } from '../block' import type { DynamicFragment } from '../fragment' -const isHydratingStack = [] as boolean[] -export let isHydrating = false export let currentHydrationNode: Node | null = null let _hydrateDynamicFragment: | ((frag: DynamicFragment, isEmpty: boolean) => void) | undefined -function pushIsHydrating(value: boolean): void { - isHydratingStack.push((isHydrating = value)) -} - -function popIsHydrating(): void { - isHydratingStack.pop() - isHydrating = isHydratingStack[isHydratingStack.length - 1] || false +export let isHydrating = false +function setIsHydrating(value: boolean) { + try { + return isHydrating + } finally { + isHydrating = value + } } export function runWithoutHydration(fn: () => any): any { + const prev = setIsHydrating(false) try { - pushIsHydrating(false) return fn() } finally { - popIsHydrating() + setIsHydrating(prev) } } @@ -75,12 +73,12 @@ function performHydration( isOptimized = true } enableHydrationNodeLookup() - pushIsHydrating(true) + const prev = setIsHydrating(true) setup() const res = fn() cleanup() currentHydrationNode = null - popIsHydrating() + setIsHydrating(prev) if (!isHydrating) disableHydrationNodeLookup() return res }