diff --git a/packages/runtime-dom/__tests__/directives/vModel.spec.ts b/packages/runtime-dom/__tests__/directives/vModel.spec.ts index 534e5dfe98e..618bbdab938 100644 --- a/packages/runtime-dom/__tests__/directives/vModel.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vModel.spec.ts @@ -344,6 +344,9 @@ describe('vModel', () => { triggerEvent('input', number) await nextTick() expect(data.number).toEqual(1.2) + triggerEvent('change', number) + await nextTick() + expect(number.value).toEqual('1.2') trim.value = ' hello, world ' triggerEvent('input', trim) diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index 5057e16d472..448a9bd8e96 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -66,9 +66,16 @@ export const vModelText: ModelDirective< } el[assignKey](domValue) }) - if (trim) { + if (trim || castToNumber) { addEventListener(el, 'change', () => { - el.value = el.value.trim() + let newValue = el.value + if (trim) { + newValue = newValue.trim() + } + if (castToNumber) { + newValue = looseToNumber(newValue) + } + el.value = newValue }) } if (!lazy) {