]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(compiler-vapor): move `hasDeferredVShow` tracking to root IR
authordaiwei <daiwei521@126.com>
Wed, 26 Nov 2025 06:05:28 +0000 (14:05 +0800)
committerdaiwei <daiwei521@126.com>
Wed, 26 Nov 2025 06:05:28 +0000 (14:05 +0800)
packages/compiler-vapor/src/generate.ts
packages/compiler-vapor/src/generators/block.ts
packages/compiler-vapor/src/ir/index.ts
packages/compiler-vapor/src/transform.ts
packages/compiler-vapor/src/transforms/utils.ts
packages/compiler-vapor/src/transforms/vShow.ts

index 8f6d03b9acf80d485bfe98e2fa22f55e2cc2aae7..ef516bf443e8023f4588b6701a99466fcd904f5d 100644 (file)
@@ -201,6 +201,9 @@ export function generate(
       `const ${setTemplateRefIdent} = ${context.helper('createTemplateRefSetter')}()`,
     )
   }
+  if (ir.hasDeferredVShow) {
+    push(NEWLINE, `const deferredApplyVShows = []`)
+  }
   push(...genBlockContent(ir.block, context, true))
   push(INDENT_END, NEWLINE)
 
index 40fa8da6322d9cb80ce6ffe13b72efe041161943..97f7dd8f3b62c92aaec490d778896b33ba3e518b 100644 (file)
@@ -43,10 +43,6 @@ export function genBlockContent(
   const { dynamic, effect, operation, returns, key } = block
   const resetBlock = context.enterBlock(block)
 
-  if (block.hasDeferredVShow) {
-    push(NEWLINE, `const deferredApplyVShows = []`)
-  }
-
   if (root) {
     for (let name of context.ir.component) {
       const id = toValidAssetId(name, 'component')
@@ -78,7 +74,7 @@ export function genBlockContent(
   push(...genOperations(operation, context))
   push(...genEffects(effect, context, genEffectsExtraFrag))
 
-  if (block.hasDeferredVShow) {
+  if (root && context.ir.hasDeferredVShow) {
     push(NEWLINE, `deferredApplyVShows.forEach(fn => fn())`)
   }
 
index 115310bbda39d1a985604abe02a0008c14aa3d88..f3ca992ce575031e7f02d4bdddaf69042f83ee51 100644 (file)
@@ -54,7 +54,6 @@ export interface BlockIRNode extends BaseIRNode {
   effect: IREffect[]
   operation: OperationNode[]
   returns: number[]
-  hasDeferredVShow: boolean
 }
 
 export interface RootIRNode {
@@ -68,6 +67,7 @@ export interface RootIRNode {
   directive: Set<string>
   block: BlockIRNode
   hasTemplateRef: boolean
+  hasDeferredVShow: boolean
 }
 
 export interface IfIRNode extends BaseIRNode {
index be0efa6547169bde170e942109f7b0878863ff00..99d8ef20277fa615d68dae43d308f18f3f775a6a 100644 (file)
@@ -256,6 +256,7 @@ export function transform(
     directive: new Set(),
     block: newBlock(node),
     hasTemplateRef: false,
+    hasDeferredVShow: false,
   }
 
   const context = new TransformContext(ir, node, options)
index b746999a18a525db223388f96cc1dcf25ea83765..f7d0594fe58151ac73eae39833d1978343d7116b 100644 (file)
@@ -30,7 +30,6 @@ export const newBlock = (node: BlockIRNode['node']): BlockIRNode => ({
   operation: [],
   returns: [],
   tempId: 0,
-  hasDeferredVShow: false,
 })
 
 export function wrapTemplate(node: ElementNode, dirs: string[]): TemplateNode {
index a60b20a71fabe83a5d890272190cd14525d899f6..0c2e2bd9df80ef1cddbefc7739cdd95452d06c07 100644 (file)
@@ -39,7 +39,7 @@ export const transformVShow: DirectiveTransform = (dir, node, context) => {
     )
 
     if (shouldDeferred) {
-      context.parent!.parent!.block.hasDeferredVShow = true
+      context.ir.hasDeferredVShow = true
     }
   }