]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore: update
authordaiwei <daiwei521@126.com>
Mon, 27 Jan 2025 01:35:14 +0000 (09:35 +0800)
committerdaiwei <daiwei521@126.com>
Mon, 27 Jan 2025 01:35:14 +0000 (09:35 +0800)
packages/compiler-core/src/ast.ts
packages/compiler-core/src/transforms/vSkip.ts

index d2402331184491a6967c4fdac994cb5d5b8a6e2b..3d09dc9691e5ff09aa074d56d07bf5e41c90524c 100644 (file)
@@ -416,7 +416,7 @@ export interface SkipNode extends Node {
   consequent: IfBranchNode | CallExpression
   alternate: IfBranchNode
   newline: boolean
-  codegenNode?: ConditionalExpression
+  codegenNode: ConditionalExpression | undefined
 }
 
 export interface ConditionalExpression extends Node {
index 9d0f11763bb6d1f90ddbd9451850fab59c641e8b..d4436a38e101eafb351a7605fcba28d345ea8b3c 100644 (file)
@@ -128,13 +128,18 @@ export function processSkip(
     processAsSkipNode = true
     children = node.children
   } else if (isComponent) {
-    ;({ processAsSkipNode, children } = resolveDefaultSlot(
-      node,
-      context,
-      processAsSkipNode,
-      children,
-      loc,
-    ))
+    const { hasDynamicSlots, defaultSlot } = resolveDefaultSlot(node, context)
+    if (!hasDynamicSlots) {
+      if (defaultSlot) {
+        processAsSkipNode = true
+        // using the cloned node for ssr VNode-based slot
+        children = context.inSSR ? clone(defaultSlot) : defaultSlot
+      } else {
+        context.onError(
+          createCompilerError(ErrorCodes.X_V_SKIP_UNEXPECTED_SLOT, loc),
+        )
+      }
+    }
   }
 
   let skipNode: SkipNode | undefined
@@ -155,6 +160,7 @@ export function processSkip(
       consequent,
       alternate: createBranchNode(node, node.loc, [node]),
       newline: true,
+      codegenNode: undefined,
     }
 
     context.replaceNode(skipNode)
@@ -163,17 +169,11 @@ export function processSkip(
   if (processCodegen) return processCodegen(skipNode)
 }
 
-function resolveDefaultSlot(
-  node: ComponentNode,
-  context: TransformContext,
-  processAsSkipNode: boolean,
-  children: TemplateChildNode[],
-  loc: SourceLocation,
-) {
+function resolveDefaultSlot(node: ComponentNode, context: TransformContext) {
+  let defaultSlot: TemplateChildNode[] | undefined = undefined
   const { slots, hasDynamicSlots } = buildSlots(node, context, undefined, true)
   // find default slot without slot props if not has dynamic slots
   if (!hasDynamicSlots && slots.type === NodeTypes.JS_OBJECT_EXPRESSION) {
-    processAsSkipNode = true
     const prop = slots.properties.find(
       p =>
         p.type === NodeTypes.JS_PROPERTY &&
@@ -182,17 +182,10 @@ function resolveDefaultSlot(
         p.value.params === undefined,
     )
     if (prop) {
-      const slotNode = prop.value.returns as TemplateChildNode[]
-      // using the cloned node for ssr VNode-based slot
-      children = context.inSSR ? clone(slotNode) : slotNode
-    } else {
-      context.onError(
-        createCompilerError(ErrorCodes.X_V_SKIP_UNEXPECTED_SLOT, loc),
-      )
+      defaultSlot = prop.value.returns as TemplateChildNode[]
     }
   }
-
-  return { processAsSkipNode, children }
+  return { hasDynamicSlots, defaultSlot }
 }
 
 function createBranchNode(