From: LYlanfeng <23229437@qq.com> Date: Tue, 8 Jun 2021 13:52:45 +0000 (+0800) Subject: fix(runtime-core): fix multiple .once event handlers on same component (#3904) X-Git-Tag: v3.1.2~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=011dee8644bb52f5bdc6365c6e8404936d57e2cd;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): fix multiple .once event handlers on same component (#3904) fix #3902 --- diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index 35bb0fa29f..d88981a43d 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/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', () => { diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index b7fbec4899..52900ea317 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/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)[handlerName] = true + instance.emitted = {} as Record } else if (instance.emitted[handlerName]) { return } + instance.emitted[handlerName] = true callWithAsyncErrorHandling( onceHandler, instance,