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.
 
 
 
customAgent/src/utils/mitt.js

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