import { patchProp } from '../src/patchProp'
-import { h, nextTick, ref, render } from '../src'
+import {
+ h,
+ nextTick,
+ ref,
+ render,
+ vModelCheckbox,
+ withDirectives,
+} from '../src'
describe('runtime-dom: props patching', () => {
test('basic', () => {
expect(el.translate).toBeFalsy()
expect(el.getAttribute('translate')).toBe('no')
})
+
+ // #11647
+ test('should not trigger input mutation when `value` is `undefined`', async () => {
+ const fn = vi.fn()
+ const comp = {
+ setup() {
+ const checked = ref()
+ return () =>
+ withDirectives(
+ h('input', {
+ type: 'checkbox',
+ value: undefined,
+ 'onUpdate:modelValue': (value: any) => {
+ checked.value = value
+ },
+ }),
+ [[vModelCheckbox, checked.value]],
+ )
+ },
+ }
+
+ const root = document.createElement('div')
+ render(h(comp), root)
+ document.body.append(root)
+
+ const el = root.children[0] as HTMLInputElement
+ const observer = new MutationObserver(fn)
+ observer.observe(el, {
+ attributes: true,
+ })
+
+ el.click()
+ await nextTick()
+
+ expect(fn).toBeCalledTimes(0)
+ })
})
// compare against its attribute value instead.
const oldValue =
tag === 'OPTION' ? el.getAttribute('value') || '' : el.value
- const newValue = value == null ? '' : String(value)
+ const newValue =
+ value == null
+ ? // #11647: value should be set as empty string for null and undefined,
+ // but <input type="checkbox"> should be set as 'on'.
+ el.type === 'checkbox'
+ ? 'on'
+ : ''
+ : String(value)
if (oldValue !== newValue || !('_value' in el)) {
el.value = newValue
}