手撕一个eventBus

本文最后更新于:2021/08/29 , 星期日 , 22:53

首先需要知道 eventBus 中的方法都有哪些。按照方法进行基础框架的搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class eventBus {
// 初始化
constructor() {}

// 触发事件
emit(eventName, ...args) {}

// 注册事件
on(eventName, cb) {}

// 注册事件但只触发一次
onOnce(eventName, cb) {}

// 取消事件
off(eventName) {}
}

new 的时候对 event 进行初始化。然后分别填入逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class eventBus {
constructor() {
this.events = {};
}

emit(eventName, ...args) {
const cb = this.events[eventName];
if (!cb) {
throw new Error("没这个事件啊");
}

cb.forEach((cb) => cb.apply(this, args));
return this;
}

on(eventName, cb) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(cb);
return this;
}

onOnce(eventName, cb) {
const func = (...args) => {
this.off(eventName, func);
cb.apply(this, args);
};
this.on(eventName, func);
}

off(eventName, cb) {
if (!cb) {
this.events[eventName] = null;
} else {
this.events[event] = this.events[event].filter((item) => item !== cb);
}
return this;
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!