1.代码
class EventBus {
constructor() {
this._events = [];
}
on(event, fn) {
if (Array.isArray(event)) {
for (let i = 0, l = event.length; i < l; i++) {
this.on(event[i], fn)
}
} else {
(this._events[event] || (this._events[event] = [])).push(fn)
}
}
once(event, fn) {
let _self=this;
function handler() {
_self.off(event, handler);
fn.apply(null,arguments);
}
handler.fn = fn;
this.on(event, handler);
}
off(event, fn) {
if (!arguments.length) {
this._events = [];
}
if (Array.isArray(event)) {
for (let i = 0, l = event.length; i < l; i++) {
this.off(event[i], fn)
}
}
const cbs = this._events[event];
if (!cbs) {
return;
}
if (arguments.length == 1) {
this._events[event] = null
}
let cb, i = cbs.length
while (i--) {
cb = cbs[i]
if (cb === fn || cb.fn === fn) {
cbs.splice(i, 1)
break
}
}
}
emit(event) {
let cbs = [...this._events[event]];
if (cbs) {
for (let i = 0, l = cbs.length; i < l; i++) {
try {
cbs[i].apply(null,[...arguments].slice(1))
} catch (e) {
new Error(e, `event handler for "${event}"`)
}
}
}
}
}
const Bus = new EventBus()
if (!Bus) {
Bus = new EventBus()
}
export default Bus
2.应用
import EventBus from '@/common/eventBus.js'
EventBus.on('change', (e) => {
console.log(e)
})
EventBus.emit('change', 'change123')