Explorar el Código

fix(runtime-core): fix emit listener check on kebab-case events (#2542)

fix #2540
shadowings-zy hace 5 años
padre
commit
3532b2b021

+ 12 - 1
packages/runtime-core/__tests__/componentEmits.spec.ts

@@ -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)
   })
 })

+ 4 - 3
packages/runtime-core/src/componentEmits.ts

@@ -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)
   )
 }