diff --git a/packages/runtime-core/__tests__/componentEmits.spec.ts b/packages/runtime-core/__tests__/componentEmits.spec.ts index 1eb216d9..a02cbb88 100644 --- a/packages/runtime-core/__tests__/componentEmits.spec.ts +++ b/packages/runtime-core/__tests__/componentEmits.spec.ts @@ -175,6 +175,21 @@ describe('component: emit', () => { expect(`event validation failed for event "foo"`).toHaveBeenWarned() }) + // #2651 + test('should not attach normalized object when mixins do not contain emits', () => { + const Foo = defineComponent({ + mixins: [{}], + render() {}, + created() { + this.$emit('foo') + } + }) + render(h(Foo), nodeOps.createElement('div')) + expect( + `Component emitted event "foo" but it is neither declared` + ).not.toHaveBeenWarned() + }) + test('.once', () => { const Foo = defineComponent({ render() {}, diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index 81af34e6..6d6ca4aa 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -165,8 +165,11 @@ export function normalizeEmitsOptions( let hasExtends = false if (__FEATURE_OPTIONS_API__ && !isFunction(comp)) { const extendEmits = (raw: ComponentOptions) => { - hasExtends = true - extend(normalized, normalizeEmitsOptions(raw, appContext, true)) + const normalizedFromExtend = normalizeEmitsOptions(raw, appContext, true) + if (normalizedFromExtend) { + hasExtends = true + extend(normalized, normalizedFromExtend) + } } if (!asMixin && appContext.mixins.length) { appContext.mixins.forEach(extendEmits)