From 044812525feef125c3a1a8de57bd7d67fb8f3cab Mon Sep 17 00:00:00 2001 From: Herrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com> Date: Wed, 22 Sep 2021 00:31:27 +0800 Subject: [PATCH] fix(compiler-core): dedupe renderSlot's default props (#4557) --- .../transforms/transformSlotOutlet.spec.ts | 20 ++++++++++++++++ .../src/transforms/transformSlotOutlet.ts | 24 +++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts index 219c209856c..fd5bd09c0f1 100644 --- a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts @@ -346,6 +346,26 @@ describe('compiler: transform outlets', () => { callee: RENDER_SLOT, arguments: [`$slots`, `"default"`, `{}`, `undefined`, `true`] }) + const fallback = parseWithSlots(`fallback`, { + 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 `, () => { diff --git a/packages/compiler-core/src/transforms/transformSlotOutlet.ts b/packages/compiler-core/src/transforms/transformSlotOutlet.ts index a5b5d81cd69..50f0e0bfc8c 100644 --- a/packages/compiler-core/src/transforms/transformSlotOutlet.ts +++ b/packages/compiler-core/src/transforms/transformSlotOutlet.ts @@ -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),