This commit is contained in:
Red Huang 2025-05-05 20:38:29 +00:00 committed by GitHub
commit e53a3cd9a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 1 deletions

View File

@ -3,6 +3,7 @@
import {
type ComponentPublicInstance,
createApp,
defineComponent,
h,
nextTick,
@ -598,4 +599,45 @@ 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()
})
})

View File

@ -228,12 +228,14 @@ export function emit(
}
}
const mixinEmitsCache = new WeakMap<ConcreteComponent, ObjectEmitsOptions>()
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