]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): dedupe renderSlot's default props (#4557)
authorHerrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com>
Tue, 21 Sep 2021 16:31:27 +0000 (00:31 +0800)
committerGitHub <noreply@github.com>
Tue, 21 Sep 2021 16:31:27 +0000 (12:31 -0400)
packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts
packages/compiler-core/src/transforms/transformSlotOutlet.ts

index 219c209856c82549e22e675c113b5b892f29226f..fd5bd09c0f1982a506edab74b1065c4e9598395c 100644 (file)
@@ -346,6 +346,26 @@ describe('compiler: transform <slot> outlets', () => {
       callee: RENDER_SLOT,
       arguments: [`$slots`, `"default"`, `{}`, `undefined`, `true`]
     })
+    const fallback = parseWithSlots(`<slot>fallback</slot>`, {
+      slotted: false,
+      scopeId: 'foo'
+    })
+
+    const child = {
+      type: NodeTypes.JS_FUNCTION_EXPRESSION,
+      params: [],
+      returns: [
+        {
+          type: NodeTypes.TEXT,
+          content: `fallback`
+        }
+      ]
+    }
+    expect((fallback.children[0] as ElementNode).codegenNode).toMatchObject({
+      type: NodeTypes.JS_CALL_EXPRESSION,
+      callee: RENDER_SLOT,
+      arguments: [`$slots`, `"default"`, `{}`, child, `true`]
+    })
   })
 
   test(`error on unexpected custom directive on <slot>`, () => {
index a5b5d81cd69c267827f3446c557cd649c65087e2..50f0e0bfc8ca4cb40bcd1e70e215696eb7a926fb 100644 (file)
@@ -20,29 +20,27 @@ export const transformSlotOutlet: NodeTransform = (node, context) => {
 
     const slotArgs: CallExpression['arguments'] = [
       context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
-      slotName
+      slotName,
+      '{}',
+      'undefined',
+      'true'
     ]
+    let expectedLen = 2
 
     if (slotProps) {
-      slotArgs.push(slotProps)
+      slotArgs[2] = slotProps
+      expectedLen = 3
     }
 
     if (children.length) {
-      if (!slotProps) {
-        slotArgs.push(`{}`)
-      }
-      slotArgs.push(createFunctionExpression([], children, false, false, loc))
+      slotArgs[3] = createFunctionExpression([], children, false, false, loc)
+      expectedLen = 4
     }
 
     if (context.scopeId && !context.slotted) {
-      if (!slotProps) {
-        slotArgs.push(`{}`)
-      }
-      if (!children.length) {
-        slotArgs.push(`undefined`)
-      }
-      slotArgs.push(`true`)
+      expectedLen = 5
     }
+    slotArgs.splice(expectedLen) // remove unused arguments
 
     node.codegenNode = createCallExpression(
       context.helper(RENDER_SLOT),