From: Evan You Date: Thu, 10 Nov 2022 02:42:27 +0000 (+0800) Subject: fix(compiler/v-model): catch incorrect v-model usage on prop bindings X-Git-Tag: v3.2.45~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=001184e6bbbc85c4698f460b1f810beca3aed262;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler/v-model): catch incorrect v-model usage on prop bindings close #5584 --- diff --git a/packages/compiler-core/__tests__/transforms/vModel.spec.ts b/packages/compiler-core/__tests__/transforms/vModel.spec.ts index 96dbe2cb5f..0af7d9eb60 100644 --- a/packages/compiler-core/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vModel.spec.ts @@ -10,7 +10,8 @@ import { ComponentNode, NodeTypes, VNodeCall, - NORMALIZE_PROPS + NORMALIZE_PROPS, + BindingTypes } from '../../src' import { ErrorCodes } from '../../src/errors' import { transformModel } from '../../src/transforms/vModel' @@ -561,5 +562,22 @@ describe('compiler: transform v-model', () => { }) ) }) + + test('used on props', () => { + const onError = jest.fn() + parseWithVModel('
', { + onError, + bindingMetadata: { + p: BindingTypes.PROPS + } + }) + + expect(onError).toHaveBeenCalledTimes(1) + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ + code: ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE + }) + ) + }) }) }) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index f0af09dda3..345aa183fc 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -87,6 +87,7 @@ export const enum ErrorCodes { X_V_MODEL_NO_EXPRESSION, X_V_MODEL_MALFORMED_EXPRESSION, X_V_MODEL_ON_SCOPE_VARIABLE, + X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, @@ -168,6 +169,7 @@ export const errorMessages: Record = { [ErrorCodes.X_V_MODEL_NO_EXPRESSION]: `v-model is missing expression.`, [ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION]: `v-model value must be a valid JavaScript member expression.`, [ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`, + [ErrorCodes.X_V_MODEL_ON_PROPS]: `v-model cannot be used on a prop, because local prop bindings are not writable.\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`, [ErrorCodes.X_INVALID_EXPRESSION]: `Error parsing JavaScript expression: `, [ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN]: ` expects exactly one child component.`, diff --git a/packages/compiler-core/src/transforms/vModel.ts b/packages/compiler-core/src/transforms/vModel.ts index bcf3749bdf..1699599469 100644 --- a/packages/compiler-core/src/transforms/vModel.ts +++ b/packages/compiler-core/src/transforms/vModel.ts @@ -35,6 +35,16 @@ export const transformModel: DirectiveTransform = (dir, node, context) => { // im SFC