nextTick,
ref,
render,
+ vModelCheckbox,
vModelDynamic,
+ vModelText,
withDirectives,
} from '@vue/runtime-dom'
expect(inputNum1.value).toBe('1')
})
+
+ // #12460
+ it('prevent input value update in mounted hook if value was updated', async () => {
+ const Comp = defineComponent({
+ data() {
+ return {
+ val: 'bug',
+ }
+ },
+ methods: {
+ onUpdate() {
+ this.val = 'ok'
+ },
+ },
+ render() {
+ return h('div', null, [
+ withDirectives(
+ h('input', {
+ 'onUpdate:modelValue': (v: any) => (this.val = v),
+ type: 'search',
+ }),
+ [[vModelText, this.val]],
+ ),
+ 'should be ' + this.val,
+ this.$slots.default!({ onUpdate: this.onUpdate }),
+ ])
+ },
+ })
+
+ const show = ref(false)
+ const Page = defineComponent({
+ render() {
+ return show.value
+ ? h(Comp, null, {
+ default: (attrs: any) => {
+ attrs.onUpdate()
+ return h('div')
+ },
+ })
+ : h('div')
+ },
+ })
+
+ render(h(Page), root)
+ expect(root.innerHTML).toBe('<div></div>')
+
+ show.value = true
+ await nextTick()
+ expect(root.innerHTML).toBe(
+ '<div><input type="search">should be ok<div></div></div>',
+ )
+ const input = root.querySelector('input')!
+ expect(input.value).toEqual('ok')
+ })
+
+ it('prevent checkbox value update in mounted hook if value was updated', async () => {
+ const Comp = defineComponent({
+ data() {
+ return {
+ val: false,
+ }
+ },
+ methods: {
+ onUpdate() {
+ this.val = true
+ },
+ },
+ render() {
+ return h('div', null, [
+ withDirectives(
+ h('input', {
+ 'onUpdate:modelValue': (v: any) => (this.val = v),
+ type: 'checkbox',
+ }),
+ [[vModelCheckbox, this.val]],
+ ),
+ 'should be ' + this.val,
+ this.$slots.default!({ onUpdate: this.onUpdate }),
+ ])
+ },
+ })
+
+ const show = ref(false)
+ const Page = defineComponent({
+ render() {
+ return show.value
+ ? h(Comp, null, {
+ default: (attrs: any) => {
+ attrs.onUpdate()
+ return h('div')
+ },
+ })
+ : h('div')
+ },
+ })
+
+ render(h(Page), root)
+ expect(root.innerHTML).toBe('<div></div>')
+
+ show.value = true
+ await nextTick()
+ expect(root.innerHTML).toBe(
+ '<div><input type="checkbox">should be true<div></div></div>',
+ )
+ const input = root.querySelector('input')!
+ expect(input.checked).toEqual(true)
+ })
})