From ff66e867a911d2ffc0896b8c266841e8204f9844 Mon Sep 17 00:00:00 2001 From: Red Huang Date: Mon, 19 Aug 2024 22:00:06 +0800 Subject: [PATCH 1/3] fix(runtime-core): use separate emits caches for components and mixins --- .../__tests__/componentEmits.spec.ts | 41 +++++++++++++++++++ packages/runtime-core/src/componentEmits.ts | 4 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index dc82c0491..a1e7e9dd6 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -3,6 +3,7 @@ import { type ComponentPublicInstance, + createApp, defineComponent, h, nextTick, @@ -598,4 +599,44 @@ describe('component: emit', () => { render(h(ComponentC), el) expect(renderFn).toHaveBeenCalledTimes(1) }) + test('merging emits for a component that is also used as a mixin', () => { + const render = () => h('div') + const CompA = { + render, + } + const validateByMixin = vi.fn(() => true) + const validateByGlobalMixin = vi.fn(() => true) + + const mixin = { + emits: { + one: validateByMixin, + }, + } + + const CompB = defineComponent({ + mixins: [mixin, CompA], + created(this) { + this.$emit('one', 1) + }, + render, + }) + + const app = createApp({ + render() { + return [h(CompA), h(CompB)] + }, + }) + + app.mixin({ + emits: { + one: validateByGlobalMixin, + two: null, + }, + }) + + const root = nodeOps.createElement('div') + app.mount(root) + expect(validateByMixin).toHaveBeenCalledTimes(1) + expect(validateByGlobalMixin).not.toHaveBeenCalled() + }) }) diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index db52bc88c..0b35a93ba 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -228,12 +228,14 @@ export function emit( } } +const mixinEmitsCache = new WeakMap() export function normalizeEmitsOptions( comp: ConcreteComponent, appContext: AppContext, asMixin = false, ): ObjectEmitsOptions | null { - const cache = appContext.emitsCache + const cache = + __FEATURE_OPTIONS_API__ && asMixin ? mixinEmitsCache : appContext.emitsCache const cached = cache.get(comp) if (cached !== undefined) { return cached From 52131fb726f5fa7c9aa6876a550c96e71b6e743c Mon Sep 17 00:00:00 2001 From: edison Date: Wed, 16 Oct 2024 11:39:43 +0800 Subject: [PATCH 2/3] Update componentEmits.spec.ts --- packages/runtime-core/__tests__/componentEmits.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index a1e7e9dd6..afc2dd46d 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -599,6 +599,7 @@ describe('component: emit', () => { render(h(ComponentC), el) expect(renderFn).toHaveBeenCalledTimes(1) }) + test('merging emits for a component that is also used as a mixin', () => { const render = () => h('div') const CompA = { From 00b5ef60e25571ccb746a61344ba4016a50587b8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:40:37 +0000 Subject: [PATCH 3/3] [autofix.ci] apply automated fixes --- packages/runtime-core/__tests__/componentEmits.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index afc2dd46d..1b8bcf9a4 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -599,7 +599,7 @@ describe('component: emit', () => { render(h(ComponentC), el) expect(renderFn).toHaveBeenCalledTimes(1) }) - + test('merging emits for a component that is also used as a mixin', () => { const render = () => h('div') const CompA = {