fix(runtime-core): fix component .once listener logic
This commit is contained in:
parent
6d2a1cb64d
commit
4bbb2b2ee6
@ -196,6 +196,30 @@ describe('component: emit', () => {
|
|||||||
expect(fn).toHaveBeenCalledTimes(1)
|
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', () => {
|
test('isEmitListener', () => {
|
||||||
const options = { click: null }
|
const options = { click: null }
|
||||||
expect(isEmitListener(options, 'onClick')).toBe(true)
|
expect(isEmitListener(options, 'onClick')).toBe(true)
|
||||||
|
@ -105,17 +105,25 @@ export function emit(
|
|||||||
handlerName = toHandlerKey(hyphenate(event))
|
handlerName = toHandlerKey(hyphenate(event))
|
||||||
handler = props[handlerName]
|
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) {
|
if (!instance.emitted) {
|
||||||
;(instance.emitted = {} as Record<string, boolean>)[handlerName] = true
|
;(instance.emitted = {} as Record<string, boolean>)[handlerName] = true
|
||||||
} else if (instance.emitted[handlerName]) {
|
} else if (instance.emitted[handlerName]) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (handler) {
|
|
||||||
callWithAsyncErrorHandling(
|
callWithAsyncErrorHandling(
|
||||||
handler,
|
onceHandler,
|
||||||
instance,
|
instance,
|
||||||
ErrorCodes.COMPONENT_EVENT_HANDLER,
|
ErrorCodes.COMPONENT_EVENT_HANDLER,
|
||||||
args
|
args
|
||||||
|
Loading…
x
Reference in New Issue
Block a user