it('should work with checkbox and true-value/false-value', async () => {
const component = defineComponent({
data() {
- return { value: null }
+ return { value: 'yes' }
},
render() {
return [
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 () => {
}
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
}
})
},
+ // 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)