diff --git a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts
index 9d8beca6..a14198c8 100644
--- a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts
@@ -521,6 +521,21 @@ describe('compiler: transform component slots', () => {
`,
true
)
+
+ // #2564
+ assertDynamicSlots(
+ `
+
+
`,
+ true
+ )
+
+ assertDynamicSlots(
+ `
+
+
`,
+ false
+ )
})
test('named slot with v-if', () => {
diff --git a/packages/compiler-core/src/transforms/vOn.ts b/packages/compiler-core/src/transforms/vOn.ts
index 207d53e4..02dd9796 100644
--- a/packages/compiler-core/src/transforms/vOn.ts
+++ b/packages/compiler-core/src/transforms/vOn.ts
@@ -79,7 +79,12 @@ export const transformOn: DirectiveTransform = (
// process the expression since it's been skipped
if (!__BROWSER__ && context.prefixIdentifiers) {
isInlineStatement && context.addIdentifiers(`$event`)
- exp = processExpression(exp, context, false, hasMultipleStatements)
+ exp = dir.exp = processExpression(
+ exp,
+ context,
+ false,
+ hasMultipleStatements
+ )
isInlineStatement && context.removeIdentifiers(`$event`)
// with scope analysis, the function is hoistable if it has no reference
// to scope variables.