From: Evan You Date: Mon, 19 Jul 2021 21:46:04 +0000 (-0400) Subject: fix(v-model): properly detect input type=number X-Git-Tag: v3.2.0-beta.2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3056e9b3dcb1ab0bd18227c6fa7bf283f98f6ef6;p=thirdparty%2Fvuejs%2Fcore.git fix(v-model): properly detect input type=number fix #3813 --- diff --git a/packages/runtime-dom/__tests__/directives/vModel.spec.ts b/packages/runtime-dom/__tests__/directives/vModel.spec.ts index 52b5e3013a..503b137cc0 100644 --- a/packages/runtime-dom/__tests__/directives/vModel.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vModel.spec.ts @@ -70,6 +70,37 @@ describe('vModel', () => { expect(input.value).toEqual('') }) + it('should work with number input', async () => { + const component = defineComponent({ + data() { + return { value: null } + }, + render() { + return [ + withVModel( + h('input', { + type: 'number', + 'onUpdate:modelValue': setValue.bind(this) + }), + this.value + ) + ] + } + }) + render(h(component), root) + + const input = root.querySelector('input')! + const data = root._vnode.component.data + expect(input.value).toEqual('') + expect(input.type).toEqual('number') + + input.value = 1 + triggerEvent('input', input) + await nextTick() + expect(typeof data.value).toEqual('number') + expect(data.value).toEqual(1) + }) + it('should work with multiple listeners', async () => { const spy = jest.fn() const component = defineComponent({ diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index d721e2f371..42960eca26 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -49,7 +49,8 @@ export const vModelText: ModelDirective< > = { created(el, { modifiers: { lazy, trim, number } }, vnode) { el._assign = getModelAssigner(vnode) - const castToNumber = number || el.type === 'number' + const castToNumber = + number || (vnode.props && vnode.props.type === 'number') addEventListener(el, lazy ? 'change' : 'input', e => { if ((e.target as any).composing) return let domValue: string | number = el.value