From 9db70959621c7df44807324a3b1a41caa2b261eb Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 30 Nov 2020 15:19:22 -0500 Subject: [PATCH] fix(compiler-core): fix scope var reference check for v-on expressions fix #2564 --- .../__tests__/transforms/vSlot.spec.ts | 15 +++++++++++++++ packages/compiler-core/src/transforms/vOn.ts | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts index 9d8beca6167..a14198c8adc 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 207d53e4195..02dd9796031 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.