]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(v-model): fix case where .trim and .number modifiers are used together (#5842)
author小刘(liulinboyi) <814921718@qq.com>
Thu, 12 May 2022 23:52:16 +0000 (07:52 +0800)
committerGitHub <noreply@github.com>
Thu, 12 May 2022 23:52:16 +0000 (19:52 -0400)
fix #5839

packages/runtime-core/__tests__/componentEmits.spec.ts
packages/runtime-core/src/componentEmits.ts
packages/runtime-dom/__tests__/directives/vModel.spec.ts
packages/runtime-dom/src/directives/vModel.ts

index 053d87140e900db42daeac6957886ce578836e9e..f22be2de0c1239b819c542c22fbdebcead2a2f94 100644 (file)
@@ -355,6 +355,37 @@ describe('component: emit', () => {
     expect(fn2).toHaveBeenCalledWith('two')
   })
 
+  test('.trim and .number modifiers should work with v-model on component', () => {
+    const Foo = defineComponent({
+      render() {},
+      created() {
+        this.$emit('update:modelValue', '    +01.2    ')
+        this.$emit('update:foo', '    1    ')
+      }
+    })
+
+    const fn1 = jest.fn()
+    const fn2 = jest.fn()
+
+    const Comp = () =>
+      h(Foo, {
+        modelValue: null,
+        modelModifiers: { trim: true, number: true },
+        'onUpdate:modelValue': fn1,
+
+        foo: null,
+        fooModifiers: { trim: true, number: true },
+        'onUpdate:foo': fn2
+      })
+
+    render(h(Comp), nodeOps.createElement('div'))
+
+    expect(fn1).toHaveBeenCalledTimes(1)
+    expect(fn1).toHaveBeenCalledWith(1.2)
+    expect(fn2).toHaveBeenCalledTimes(1)
+    expect(fn2).toHaveBeenCalledWith(1)
+  })
+
   test('isEmitListener', () => {
     const options = {
       click: null,
index 3983e5885b3f3522d4a34febe77765dfd351b3a7..68393c80b351e2b31d879bdb9ef329f1a782f773 100644 (file)
@@ -122,7 +122,8 @@ export function emit(
     const { number, trim } = props[modifiersKey] || EMPTY_OBJ
     if (trim) {
       args = rawArgs.map(a => a.trim())
-    } else if (number) {
+    }
+    if (number) {
       args = rawArgs.map(toNumber)
     }
   }
index a192e930128f9a48fdc25112a1b675e37b9b2cd4..c682fd5b868dcd437134d49054fe3c92e5c51e38 100644 (file)
@@ -201,7 +201,7 @@ describe('vModel', () => {
   it('should support modifiers', async () => {
     const component = defineComponent({
       data() {
-        return { number: null, trim: null, lazy: null }
+        return { number: null, trim: null, lazy: null, trimNumber: null }
       },
       render() {
         return [
@@ -229,6 +229,19 @@ describe('vModel', () => {
               trim: true
             }
           ),
+          withVModel(
+            h('input', {
+              class: 'trim-number',
+              'onUpdate:modelValue': (val: any) => {
+                this.trimNumber = val
+              }
+            }),
+            this.trimNumber,
+            {
+              trim: true,
+              number: true
+            }
+          ),
           withVModel(
             h('input', {
               class: 'lazy',
@@ -248,6 +261,7 @@ describe('vModel', () => {
 
     const number = root.querySelector('.number')
     const trim = root.querySelector('.trim')
+    const trimNumber = root.querySelector('.trim-number')
     const lazy = root.querySelector('.lazy')
     const data = root._vnode.component.data
 
@@ -261,6 +275,16 @@ describe('vModel', () => {
     await nextTick()
     expect(data.trim).toEqual('hello, world')
 
+    trimNumber.value = '    1    '
+    triggerEvent('input', trimNumber)
+    await nextTick()
+    expect(data.trimNumber).toEqual(1)
+
+    trimNumber.value = '    +01.2    '
+    triggerEvent('input', trimNumber)
+    await nextTick()
+    expect(data.trimNumber).toEqual(1.2)
+
     lazy.value = 'foo'
     triggerEvent('change', lazy)
     await nextTick()
index 3d05e9fa47fe77d6e25e0d0016716de342767098..1a14decd06ac9a51e71b64f3cc22f3419365a585 100644 (file)
@@ -52,7 +52,8 @@ export const vModelText: ModelDirective<
       let domValue: string | number = el.value
       if (trim) {
         domValue = domValue.trim()
-      } else if (castToNumber) {
+      }
+      if (castToNumber) {
         domValue = toNumber(domValue)
       }
       el._assign(domValue)