fix(compiler-core): dedupe renderSlot's default props (#4557)

This commit is contained in:
Herrington Darkholme 2021-09-22 00:31:27 +08:00 committed by GitHub
parent ed6470c845
commit 044812525f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 13 deletions

View File

@ -346,6 +346,26 @@ describe('compiler: transform <slot> outlets', () => {
callee: RENDER_SLOT, callee: RENDER_SLOT,
arguments: [`$slots`, `"default"`, `{}`, `undefined`, `true`] 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>`, () => { test(`error on unexpected custom directive on <slot>`, () => {

View File

@ -20,29 +20,27 @@ export const transformSlotOutlet: NodeTransform = (node, context) => {
const slotArgs: CallExpression['arguments'] = [ const slotArgs: CallExpression['arguments'] = [
context.prefixIdentifiers ? `_ctx.$slots` : `$slots`, context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
slotName slotName,
'{}',
'undefined',
'true'
] ]
let expectedLen = 2
if (slotProps) { if (slotProps) {
slotArgs.push(slotProps) slotArgs[2] = slotProps
expectedLen = 3
} }
if (children.length) { if (children.length) {
if (!slotProps) { slotArgs[3] = createFunctionExpression([], children, false, false, loc)
slotArgs.push(`{}`) expectedLen = 4
}
slotArgs.push(createFunctionExpression([], children, false, false, loc))
} }
if (context.scopeId && !context.slotted) { if (context.scopeId && !context.slotted) {
if (!slotProps) { expectedLen = 5
slotArgs.push(`{}`)
}
if (!children.length) {
slotArgs.push(`undefined`)
}
slotArgs.push(`true`)
} }
slotArgs.splice(expectedLen) // remove unused arguments
node.codegenNode = createCallExpression( node.codegenNode = createCallExpression(
context.helper(RENDER_SLOT), context.helper(RENDER_SLOT),