Przeglądaj źródła

fix(runtime-core): fix multiple .once event handlers on same component (#3904)

fix #3902
LYlanfeng 4 lat temu
rodzic
commit
011dee8644

+ 8 - 2
packages/runtime-core/__tests__/componentEmits.spec.ts

@@ -245,21 +245,27 @@ describe('component: emit', () => {
     const Foo = defineComponent({
       render() {},
       emits: {
-        foo: null
+        foo: null,
+        bar: null
       },
       created() {
         this.$emit('foo')
         this.$emit('foo')
+        this.$emit('bar')
+        this.$emit('bar')
       }
     })
     const fn = jest.fn()
+    const barFn = jest.fn()
     render(
       h(Foo, {
-        onFooOnce: fn
+        onFooOnce: fn,
+        onBarOnce: barFn
       }),
       nodeOps.createElement('div')
     )
     expect(fn).toHaveBeenCalledTimes(1)
+    expect(barFn).toHaveBeenCalledTimes(1)
   })
 
   test('.once with normal listener of the same name', () => {

+ 2 - 1
packages/runtime-core/src/componentEmits.ts

@@ -149,10 +149,11 @@ export function emit(
   const onceHandler = props[handlerName + `Once`]
   if (onceHandler) {
     if (!instance.emitted) {
-      ;(instance.emitted = {} as Record<string, boolean>)[handlerName] = true
+      instance.emitted = {} as Record<any, boolean>
     } else if (instance.emitted[handlerName]) {
       return
     }
+    instance.emitted[handlerName] = true
     callWithAsyncErrorHandling(
       onceHandler,
       instance,