Skip to content

Commit

Permalink
fix(runtime-core): use separate emits caches for components and mixins
Browse files Browse the repository at this point in the history
  • Loading branch information
gcaaa31928 committed Aug 21, 2024
1 parent 44973bb commit f69841f
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
74 changes: 74 additions & 0 deletions packages/runtime-core/__tests__/componentEmits.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import {
type ComponentPublicInstance,
createApp,
defineComponent,
h,
nextTick,
Expand Down Expand Up @@ -599,3 +600,76 @@ describe('component: emit', () => {
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 mixin = {
emits: {
one: (arg: number) => arg === 1,
},
}

const CompB = {
mixins: [mixin, CompA],
created(this: ComponentPublicInstance) {
this.$emit('one', 1)
},
render,
}

const app = createApp({
render() {
return [h(CompA), ', ', h(CompB)]
},
})

app.mixin({
emits: {
one: (arg: number) => arg === 0,
two: null,
},
})

const root = nodeOps.createElement('div')
app.mount(root)
expect(`event validation failed for event "one"`).not.toHaveBeenWarned()
})

test('merging props from global mixins and extends', () => {
let renderProxy: any
let extendedRenderProxy: any
const render = () => h('div')
const Comp = {
mounted(this: ComponentPublicInstance) {
renderProxy = this
},
render,
}

const ExtendedComp = {
extends: Comp,
mounted(this: ComponentPublicInstance) {
extendedRenderProxy = this
},
render,
}

const app = createApp({
render: () => [h(ExtendedComp), h(Comp)],
})

const emits = {
one: (arg: number) => arg === 0,
two: (arg: number) => arg === 0,
}
app.mixin({ emits })

const root = nodeOps.createElement('div')
app.mount(root)
expect(renderProxy._.emitsOptions).toMatchObject(emits)
expect(extendedRenderProxy._.emitsOptions).toMatchObject(emits)
})
4 changes: 3 additions & 1 deletion packages/runtime-core/src/componentEmits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,12 +219,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
Expand Down

0 comments on commit f69841f

Please sign in to comment.