]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): fix emit listener check on kebab-case events (#2542)
authorshadowings-zy <shadowingszy@outlook.com>
Fri, 27 Nov 2020 20:24:29 +0000 (04:24 +0800)
committerGitHub <noreply@github.com>
Fri, 27 Nov 2020 20:24:29 +0000 (15:24 -0500)
fix #2540

packages/runtime-core/__tests__/componentEmits.spec.ts
packages/runtime-core/src/componentEmits.ts

index 53c8d324ea307a8638c7d09459a9da5615630020..2fb1fbb068a30b4435a6cf6e0178e32db7662ca4 100644 (file)
@@ -283,12 +283,23 @@ describe('component: emit', () => {
   })
 
   test('isEmitListener', () => {
-    const options = { click: null }
+    const options = {
+      click: null,
+      'test-event': null,
+      fooBar: null,
+      FooBaz: null
+    }
     expect(isEmitListener(options, 'onClick')).toBe(true)
     expect(isEmitListener(options, 'onclick')).toBe(false)
     expect(isEmitListener(options, 'onBlick')).toBe(false)
     // .once listeners
     expect(isEmitListener(options, 'onClickOnce')).toBe(true)
     expect(isEmitListener(options, 'onclickOnce')).toBe(false)
+    // kebab-case option
+    expect(isEmitListener(options, 'onTestEvent')).toBe(true)
+    // camelCase option
+    expect(isEmitListener(options, 'onFooBar')).toBe(true)
+    // PascalCase option
+    expect(isEmitListener(options, 'onFooBaz')).toBe(true)
   })
 })
index 6b9e505de6299947ac562d5334c311762c9d4525..81af34e6708905028d1ed3b874708dd017dda188 100644 (file)
@@ -201,9 +201,10 @@ export function isEmitListener(
   if (!options || !isOn(key)) {
     return false
   }
-  key = key.replace(/Once$/, '')
+  key = key.slice(2).replace(/Once$/, '')
   return (
-    hasOwn(options, key[2].toLowerCase() + key.slice(3)) ||
-    hasOwn(options, key.slice(2))
+    hasOwn(options, key[0].toLowerCase() + key.slice(1)) ||
+    hasOwn(options, hyphenate(key)) ||
+    hasOwn(options, key)
   )
 }