You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
988 B
40 lines
988 B
// 轻量事件总线(mitt 风格,零依赖),供跨组件通信使用
|
|
// 使用方式:emitter.on('event', handler) / emitter.emit('event', payload) / emitter.off('event', handler)
|
|
const eventMap = new Map()
|
|
|
|
export const emitter = {
|
|
on(type, handler) {
|
|
const handlers = eventMap.get(type)
|
|
if (handlers) {
|
|
handlers.push(handler)
|
|
} else {
|
|
eventMap.set(type, [handler])
|
|
}
|
|
return this
|
|
},
|
|
off(type, handler) {
|
|
const handlers = eventMap.get(type)
|
|
if (!handlers) return this
|
|
if (handler) {
|
|
const index = handlers.indexOf(handler)
|
|
if (index > -1) handlers.splice(index, 1)
|
|
if (!handlers.length) eventMap.delete(type)
|
|
} else {
|
|
eventMap.delete(type)
|
|
}
|
|
return this
|
|
},
|
|
emit(type, evt) {
|
|
const handlers = eventMap.get(type)
|
|
if (handlers) {
|
|
;[...handlers].forEach((fn) => fn(evt))
|
|
}
|
|
return this
|
|
},
|
|
clear() {
|
|
eventMap.clear()
|
|
return this
|
|
},
|
|
}
|
|
|
|
export default emitter
|
|
|