Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/runtime-dom/__tests__/directives/vModel.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,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)
Expand Down
19 changes: 9 additions & 10 deletions packages/runtime-dom/src/directives/vModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ type ModelDirective<T, Modifiers extends string = string> = ObjectDirective<
Modifiers
>

function castValue(value: string, trim?: boolean, number?: boolean | null) {
if (trim) value = value.trim()
if (number) value = looseToNumber(value)
return value
}

// We are exporting the v-model runtime directly as vnode hooks so that it can
// be tree-shaken in case v-model is never used.
export const vModelText: ModelDirective<
Expand All @@ -57,18 +63,11 @@ export const vModelText: ModelDirective<
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
if (trim) {
domValue = domValue.trim()
}
if (castToNumber) {
domValue = looseToNumber(domValue)
}
el[assignKey](domValue)
el[assignKey](castValue(el.value, trim, castToNumber))
})
if (trim) {
if (trim || castToNumber) {
addEventListener(el, 'change', () => {
el.value = el.value.trim()
el.value = castValue(el.value, trim, castToNumber)
})
}
if (!lazy) {
Expand Down
Loading