]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(v-model): respect checkbox true-value/false-value on initial render
authorEvan You <yyx990803@gmail.com>
Tue, 1 Dec 2020 17:02:37 +0000 (12:02 -0500)
committerEvan You <yyx990803@gmail.com>
Tue, 1 Dec 2020 17:02:37 +0000 (12:02 -0500)
fix #2694

packages/runtime-dom/__tests__/directives/vModel.spec.ts
packages/runtime-dom/src/directives/vModel.ts

index 8bd4b57978c20af9e42ba9b6901c5fab0bbb495d..52b5e3013a5f32c61afe5f3d57c5a0f945498213 100644 (file)
@@ -280,7 +280,7 @@ describe('vModel', () => {
   it('should work with checkbox and true-value/false-value', async () => {
     const component = defineComponent({
       data() {
-        return { value: null }
+        return { value: 'yes' }
       },
       render() {
         return [
@@ -301,23 +301,26 @@ describe('vModel', () => {
     const input = root.querySelector('input')
     const data = root._vnode.component.data
 
-    input.checked = true
-    triggerEvent('change', input)
-    await nextTick()
-    expect(data.value).toEqual('yes')
+    // DOM checked state should respect initial true-value/false-value
+    expect(input.checked).toEqual(true)
 
-    data.value = 'no'
+    input.checked = false
+    triggerEvent('change', input)
     await nextTick()
-    expect(input.checked).toEqual(false)
+    expect(data.value).toEqual('no')
 
     data.value = 'yes'
     await nextTick()
     expect(input.checked).toEqual(true)
 
-    input.checked = false
+    data.value = 'no'
+    await nextTick()
+    expect(input.checked).toEqual(false)
+
+    input.checked = true
     triggerEvent('change', input)
     await nextTick()
-    expect(data.value).toEqual('no')
+    expect(data.value).toEqual('yes')
   })
 
   it('should work with checkbox and true-value/false-value with object values', async () => {
index a157177f73c8bfddca2ac794f68e841f822aef96..a90c4466a174958430538af215aca24ba248315c 100644 (file)
@@ -99,8 +99,7 @@ export const vModelText: ModelDirective<
 }
 
 export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
-  created(el, binding, vnode) {
-    setChecked(el, binding, vnode)
+  created(el, _, vnode) {
     el._assign = getModelAssigner(vnode)
     addEventListener(el, 'change', () => {
       const modelValue = (el as any)._modelValue
@@ -130,6 +129,8 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
       }
     })
   },
+  // set initial checked on mount to wait for true-value/false-value
+  mounted: setChecked,
   beforeUpdate(el, binding, vnode) {
     el._assign = getModelAssigner(vnode)
     setChecked(el, binding, vnode)