From 4bbb2b2ee6866ed80cb542c2ff24207b4bd09bda Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 20 Oct 2020 09:49:53 -0400 Subject: [PATCH] fix(runtime-core): fix component .once listener logic --- .../__tests__/componentEmits.spec.ts | 24 +++++++++++++++++++ packages/runtime-core/src/componentEmits.ts | 18 ++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index 317b36f8..f93d547a 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -196,6 +196,30 @@ describe('component: emit', () => { expect(fn).toHaveBeenCalledTimes(1) }) + test('.once with normal listener of the same name', () => { + const Foo = defineComponent({ + render() {}, + emits: { + foo: null + }, + created() { + this.$emit('foo') + this.$emit('foo') + } + }) + const onFoo = jest.fn() + const onFooOnce = jest.fn() + render( + h(Foo, { + onFoo, + onFooOnce + }), + nodeOps.createElement('div') + ) + expect(onFoo).toHaveBeenCalledTimes(2) + expect(onFooOnce).toHaveBeenCalledTimes(1) + }) + test('isEmitListener', () => { const options = { click: null } expect(isEmitListener(options, 'onClick')).toBe(true) diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index 7f1bd181..726a16b8 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -105,17 +105,25 @@ export function emit( handlerName = toHandlerKey(hyphenate(event)) handler = props[handlerName] } - if (!handler) { - handler = props[handlerName + `Once`] + + if (handler) { + callWithAsyncErrorHandling( + handler, + instance, + ErrorCodes.COMPONENT_EVENT_HANDLER, + args + ) + } + + const onceHandler = props[handlerName + `Once`] + if (onceHandler) { if (!instance.emitted) { ;(instance.emitted = {} as Record)[handlerName] = true } else if (instance.emitted[handlerName]) { return } - } - if (handler) { callWithAsyncErrorHandling( - handler, + onceHandler, instance, ErrorCodes.COMPONENT_EVENT_HANDLER, args