]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(runtime-vapor): simplify hydration state management (#14259) minor
authoredison <daiwei521@126.com>
Mon, 29 Dec 2025 06:24:14 +0000 (14:24 +0800)
committerGitHub <noreply@github.com>
Mon, 29 Dec 2025 06:24:14 +0000 (14:24 +0800)
packages/runtime-vapor/src/dom/hydration.ts

index 881713815f85688a7952ca21d67fc7b472912749..6214904e3e68e7ee45ba629a495a1956184de157 100644 (file)
@@ -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<T>(
     isOptimized = true
   }
   enableHydrationNodeLookup()
-  pushIsHydrating(true)
+  const prev = setIsHydrating(true)
   setup()
   const res = fn()
   cleanup()
   currentHydrationNode = null
-  popIsHydrating()
+  setIsHydrating(prev)
   if (!isHydrating) disableHydrationNodeLookup()
   return res
 }