事件总线
1. 解决问题
2. 实现思想
- 定义一个 对象结构 {eventName1: [eventFn1, eventFn2],eventName2: [eventFn1, eventFn2]}
- 定义事件监听:将需要监听的函数以上述结构存入对象中
eventBus.on("navbutton", (name, age, height) => {
console.log("navbutton01", name, age, height);
});
- 定义事件发送:通过emit方法进行事件发送,触发对应的监听函数
const button01 = document.querySelector(".but");
button01.onclick = function (params) {
console.log("按钮点击");
eventBus.emit("navbutton","why", 18, 1.88);
}
- 总结:将监听事件放入特定的数据结构中,通过emit方法,查询到特定函数进行触发
3. 实现代码
class HTEventBus {
constructor() {
this.eventMap = {};
}
on(eventName, eventFn) {
let eventFns = this.eventMap[eventName];
if (!eventFns) {
eventFns = [];
this.eventMap[eventName] = eventFns;
}
eventFns.push(eventFn);
};
emit(eventName, ...args) {
let eventFns = this.eventMap[eventName];
if (!eventFns) return;
eventFns.forEach(fn => {
fn(...args);
});
};
off(eventName, eventFn) {
let eventFns = this.eventMap[eventName];
if (!eventFns) return;
this.eventMap[eventName] = eventFns.filter(fn => fn !== eventFn);
}
}
4. 使用方法
const eventBus = new HTEventBus();
eventBus.on("navbutton", (name, age, height) => {
console.log("navbutton01", name, age, height);
});
const click = () => console.log("navbutton02");
eventBus.on("navbutton", click);
setTimeout(() => {
eventBus.off("navbutton", click);
}, 5000);
const button01 = document.querySelector(".but");
button01.onclick = function (params) {
console.log("按钮点击");
eventBus.emit("navbutton","why", 18, 1.88);
}