Skip to content

Commit 48f00c0

Browse files
committed
fix(v-model): respect checkbox true-value/false-value on initial render
fix #2694
1 parent 085bbd5 commit 48f00c0

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

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

+12-9
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ describe('vModel', () => {
280280
it('should work with checkbox and true-value/false-value', async () => {
281281
const component = defineComponent({
282282
data() {
283-
return { value: null }
283+
return { value: 'yes' }
284284
},
285285
render() {
286286
return [
@@ -301,23 +301,26 @@ describe('vModel', () => {
301301
const input = root.querySelector('input')
302302
const data = root._vnode.component.data
303303

304-
input.checked = true
305-
triggerEvent('change', input)
306-
await nextTick()
307-
expect(data.value).toEqual('yes')
304+
// DOM checked state should respect initial true-value/false-value
305+
expect(input.checked).toEqual(true)
308306

309-
data.value = 'no'
307+
input.checked = false
308+
triggerEvent('change', input)
310309
await nextTick()
311-
expect(input.checked).toEqual(false)
310+
expect(data.value).toEqual('no')
312311

313312
data.value = 'yes'
314313
await nextTick()
315314
expect(input.checked).toEqual(true)
316315

317-
input.checked = false
316+
data.value = 'no'
317+
await nextTick()
318+
expect(input.checked).toEqual(false)
319+
320+
input.checked = true
318321
triggerEvent('change', input)
319322
await nextTick()
320-
expect(data.value).toEqual('no')
323+
expect(data.value).toEqual('yes')
321324
})
322325

323326
it('should work with checkbox and true-value/false-value with object values', async () => {

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ export const vModelText: ModelDirective<
9999
}
100100

101101
export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
102-
created(el, binding, vnode) {
103-
setChecked(el, binding, vnode)
102+
created(el, _, vnode) {
104103
el._assign = getModelAssigner(vnode)
105104
addEventListener(el, 'change', () => {
106105
const modelValue = (el as any)._modelValue
@@ -130,6 +129,8 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
130129
}
131130
})
132131
},
132+
// set initial checked on mount to wait for true-value/false-value
133+
mounted: setChecked,
133134
beforeUpdate(el, binding, vnode) {
134135
el._assign = getModelAssigner(vnode)
135136
setChecked(el, binding, vnode)

0 commit comments

Comments
 (0)