From ec52a2abe1f972268c89ca9cace08046d486d817 Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Fri, 26 Jan 2024 03:17:43 +0000 Subject: [PATCH 1/3] fix: support v-bind shorthand syntax in slot --- .../transforms/transformSlotOutlet.spec.ts | 16 ++++++++++++++++ .../src/transforms/transformSlotOutlet.ts | 16 +++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts index f8809ab6a7b..6420bdbbdac 100644 --- a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts @@ -389,4 +389,20 @@ describe('compiler: transform outlets', () => { }, }) }) + + test('dynamically named slot outlet with v-bind shorthand', () => { + const ast = parseWithSlots(``) + expect((ast.children[0] as ElementNode).codegenNode).toMatchObject({ + type: NodeTypes.JS_CALL_EXPRESSION, + callee: RENDER_SLOT, + arguments: [ + `$slots`, + { + type: NodeTypes.SIMPLE_EXPRESSION, + content: `name`, + isStatic: false, + }, + ], + }) + }) }) diff --git a/packages/compiler-core/src/transforms/transformSlotOutlet.ts b/packages/compiler-core/src/transforms/transformSlotOutlet.ts index 310b6a94ea0..557cdf10a5f 100644 --- a/packages/compiler-core/src/transforms/transformSlotOutlet.ts +++ b/packages/compiler-core/src/transforms/transformSlotOutlet.ts @@ -6,12 +6,14 @@ import { type SlotOutletNode, createCallExpression, createFunctionExpression, + createSimpleExpression, } from '../ast' import { isSlotOutlet, isStaticArgOf, isStaticExp } from '../utils' import { type PropsExpression, buildProps } from './transformElement' import { ErrorCodes, createCompilerError } from '../errors' import { RENDER_SLOT } from '../runtimeHelpers' import { camelize } from '@vue/shared' +import { processExpression } from './transformExpression' export const transformSlotOutlet: NodeTransform = (node, context) => { if (isSlotOutlet(node)) { @@ -75,7 +77,19 @@ export function processSlotOutlet( } } } else { - if (p.name === 'bind' && isStaticArgOf(p.arg, 'name')) { + // :name is replaced by :name="name" + if ( + p.name === 'bind' && + !p.exp && + p.arg && + p.arg.type === NodeTypes.SIMPLE_EXPRESSION + ) { + const name = camelize(p.arg.content) + slotName = p.exp = createSimpleExpression(name, false, p.arg.loc) + if (!__BROWSER__) { + p.exp = processExpression(p.exp, context) + } + } else if (p.name === 'bind' && isStaticArgOf(p.arg, 'name')) { if (p.exp) slotName = p.exp } else { if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) { From 51e7b241f825eb643b36c4d14e4dd5737ced3975 Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Fri, 26 Jan 2024 08:09:44 +0000 Subject: [PATCH 2/3] fix: update v-bind shorthand in slot --- .../src/transforms/transformSlotOutlet.ts | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/compiler-core/src/transforms/transformSlotOutlet.ts b/packages/compiler-core/src/transforms/transformSlotOutlet.ts index 557cdf10a5f..d2160098efb 100644 --- a/packages/compiler-core/src/transforms/transformSlotOutlet.ts +++ b/packages/compiler-core/src/transforms/transformSlotOutlet.ts @@ -77,20 +77,16 @@ export function processSlotOutlet( } } } else { - // :name is replaced by :name="name" - if ( - p.name === 'bind' && - !p.exp && - p.arg && - p.arg.type === NodeTypes.SIMPLE_EXPRESSION - ) { - const name = camelize(p.arg.content) - slotName = p.exp = createSimpleExpression(name, false, p.arg.loc) - if (!__BROWSER__) { - p.exp = processExpression(p.exp, context) + if (p.name === 'bind' && isStaticArgOf(p.arg, 'name')) { + if (p.exp) { + slotName = p.exp + } else if (p.arg && p.arg.type === NodeTypes.SIMPLE_EXPRESSION) { + const name = camelize(p.arg.content) + slotName = p.exp = createSimpleExpression(name, false, p.arg.loc) + if (!__BROWSER__) { + p.exp = processExpression(p.exp, context) + } } - } else if (p.name === 'bind' && isStaticArgOf(p.arg, 'name')) { - if (p.exp) slotName = p.exp } else { if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) { p.arg.content = camelize(p.arg.content) From f9c71f47044b5d96a138f758fc655ee328508c1d Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Fri, 26 Jan 2024 09:25:21 +0000 Subject: [PATCH 3/3] fix: support v-bind shorthand for slotName --- packages/compiler-core/src/transforms/transformSlotOutlet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-core/src/transforms/transformSlotOutlet.ts b/packages/compiler-core/src/transforms/transformSlotOutlet.ts index d2160098efb..ea635e997b1 100644 --- a/packages/compiler-core/src/transforms/transformSlotOutlet.ts +++ b/packages/compiler-core/src/transforms/transformSlotOutlet.ts @@ -84,7 +84,7 @@ export function processSlotOutlet( const name = camelize(p.arg.content) slotName = p.exp = createSimpleExpression(name, false, p.arg.loc) if (!__BROWSER__) { - p.exp = processExpression(p.exp, context) + slotName = p.exp = processExpression(p.exp, context) } } } else {