事件总线(eventBus)思想与代码实现

事件总线



1. 解决问题

  • 实现组件间的远程通信,避免多重嵌套组件传递问题

2. 实现思想

  1. 定义一个 对象结构 {eventName1: [eventFn1, eventFn2],eventName2: [eventFn1, eventFn2]}
  2. 定义事件监听:将需要监听的函数以上述结构存入对象中
    //eventBus是该对象,存在该对象结构eventMap
    //on方法就是将事件名称、绑定函数, 存入该对象结构中
    eventBus.on("navbutton", (name, age, height) => {
            console.log("navbutton01", name, age, height);
        });
    
  3. 定义事件发送:通过emit方法进行事件发送,触发对应的监听函数
    const button01 = document.querySelector(".but");
        button01.onclick = function (params) {
            console.log("按钮点击");
            //通过eventBus对象中emit传入eventName进行事件发送,触发监听函数
            eventBus.emit("navbutton","why", 18, 1.88);
        }
    
  4. 总结:将监听事件放入特定的数据结构中,通过emit方法,查询到特定函数进行触发

3. 实现代码

        class HTEventBus {
            constructor() {
                this.eventMap = {};
            }
            // 事件监听
            on(eventName, eventFn) {
            	//通过事件名 获取到存储函数的数组
                let eventFns = this.eventMap[eventName];
                //如果没有,建立一个空数组,再将函数push进去
                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);
                // for (let index = 0; index < eventFns.length; index++) {
                //     if(eventFns[index] === eventFn) {
                //         eventFns.splice(index, 1);
                //         break;
                //     }
                    
                // }
            }
        }

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);
        // eventBus.on("link", () => {
        //     console.log("navbutton02");
        // });
        const button01 = document.querySelector(".but");
        button01.onclick = function (params) {
            console.log("按钮点击");
            eventBus.emit("navbutton","why", 18, 1.88);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值