diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap index 5e3fdf588bc..236e2682565 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap @@ -209,7 +209,7 @@ export function render(_ctx, _cache) { return (_openBlock(), _createBlock(\\"div\\", null, [ _createVNode(\\"div\\", null, [ _createVNode(\\"div\\", { - onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.foo(...args))) + onClick: _cache[1] || (_cache[1] = (...args) => ( (() => { if (typeof _ctx.foo === 'function') { return _ctx.foo } else { console.warn('v-on expression is not a function.') return () => { } } })()(...args))) }) ]) ])) diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index 57408568fbc..1fd33bbe73c 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -10,7 +10,7 @@ import { transform, VNodeCall } from '../../src' -import { transformOn } from '../../src/transforms/vOn' +import { transformOn, wrapExpressionContent } from '../../src/transforms/vOn' import { transformElement } from '../../src/transforms/transformElement' import { transformExpression } from '../../src/transforms/transformExpression' @@ -30,6 +30,21 @@ function parseWithVOn(template: string, options: CompilerOptions = {}) { } describe('compiler: transform v-on', () => { + test('wrapper', () => { + const wrapedExp = wrapExpressionContent('onClick') + expect(wrapedExp).toMatch( + ` + (() => { + if (typeof onClick === 'function') { + return onClick + } else { + console.warn('v-on expression is not a function.') + return () => { } + } + })()`.replace(/\s+/g, ' ') + ) + }) + test('basic', () => { const { node } = parseWithVOn(`
`) expect((node.codegenNode as VNodeCall).props).toMatchObject({ @@ -476,7 +491,11 @@ describe('compiler: transform v-on', () => { index: 1, value: { type: NodeTypes.COMPOUND_EXPRESSION, - children: [`(...args) => (`, { content: `_ctx.foo(...args)` }, `)`] + children: [ + `(...args) => (`, + { content: wrapExpressionContent(`_ctx.foo`) }, + `)` + ] } }) }) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index a3419c88455..7c30b387044 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -70,6 +70,7 @@ export const enum ErrorCodes { X_V_FOR_TEMPLATE_KEY_PLACEMENT, X_V_BIND_NO_EXPRESSION, X_V_ON_NO_EXPRESSION, + X_V_ON_EXPRESSION_NOT_FUNCTION, X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET, X_V_SLOT_MIXED_SLOT_USAGE, X_V_SLOT_DUPLICATE_SLOT_NAMES, @@ -144,6 +145,7 @@ export const errorMessages: { [code: number]: string } = { [ErrorCodes.X_V_FOR_TEMPLATE_KEY_PLACEMENT]: `