소스 검색

fix(v-model): unnecessary value binding error should apply to dynamic instead of static binding

close #3596
Evan You 2 년 전
부모
커밋
2859b653c9
2개의 변경된 파일26개의 추가작업 그리고 3개의 파일을 삭제
  1. 21 0
      packages/compiler-dom/__tests__/transforms/vModel.spec.ts
  2. 5 3
      packages/compiler-dom/src/transforms/vModel.ts

+ 21 - 0
packages/compiler-dom/__tests__/transforms/vModel.spec.ts

@@ -137,6 +137,27 @@ describe('compiler: transform v-model', () => {
         })
       )
     })
+
+    test('should error on dynamic value binding alongside v-model', () => {
+      const onError = vi.fn()
+      transformWithModel(`<input v-model="test" :value="test" />`, {
+        onError
+      })
+      expect(onError).toHaveBeenCalledWith(
+        expect.objectContaining({
+          code: DOMErrorCodes.X_V_MODEL_UNNECESSARY_VALUE
+        })
+      )
+    })
+
+    // #3596
+    test('should NOT error on static value binding alongside v-model', () => {
+      const onError = vi.fn()
+      transformWithModel(`<input v-model="test" value="test" />`, {
+        onError
+      })
+      expect(onError).not.toHaveBeenCalled()
+    })
   })
 
   describe('modifiers', () => {

+ 5 - 3
packages/compiler-dom/src/transforms/vModel.ts

@@ -4,7 +4,9 @@ import {
   ElementTypes,
   findProp,
   NodeTypes,
-  hasDynamicKeyVBind
+  hasDynamicKeyVBind,
+  findDir,
+  isStaticArgOf
 } from '@vue/compiler-core'
 import { createDOMCompilerError, DOMErrorCodes } from '../errors'
 import {
@@ -32,8 +34,8 @@ export const transformModel: DirectiveTransform = (dir, node, context) => {
   }
 
   function checkDuplicatedValue() {
-    const value = findProp(node, 'value')
-    if (value) {
+    const value = findDir(node, 'bind')
+    if (value && isStaticArgOf(value.arg, 'value')) {
       context.onError(
         createDOMCompilerError(
           DOMErrorCodes.X_V_MODEL_UNNECESSARY_VALUE,