实现一个Event类

实现一个Event类


使用ES6实现一个事件类Event,包含了下面功能:绑定事件、解绑事件和派发事件。

  • on(eventName,func()):监听eventName事件,事件触发的时候调用func函数;
  • emit(eventName, arg1,arg2,arg3....):触发eventName事件,并且把参数arg1、arg2、arg3...传给事件处理函数;
  • off(eventName, func): 停止监听某个事件。

实现Event类的核心其实就是发布订阅模式,即组件间通信使用事件监听和派发的方式,而不是直接相互调用组件方法。
核心思想:

  • 为了实现绑定事件需要_cache对象记录绑定了那些事件。
  • 事件发生时,需要从_cache中读取出来事件回调,以此执行他们。
  • 一般页面中事件派发(读)要比事件绑定(写)多,因此设计数据结构时,需要在事件发生时,更加快速的找到对应事件的回调函数,然后执行。
class Event {
    constructor () {
        // 储存事件的数据结构
        // 为了快速查找,使用对象
        this._cache = {}
    }
    //  事件绑定
    on(type, callback) {
        // 为了按类查找方便和节省空间
        // 将同一类型事件被放到同一个数组里
        // 这里的数据是队列,遵循先进先出原则
        let fns = (this._cache[type] = this._cache[type] || []); 
        if(fns.indexOf(callback) === -1) {
            fns.push(callback)
        }
        return this;
    }
    // 事件触发
    // emit
    trigger(type,data) {
        let fns = this._cache[type];
        if(Array.isArray(fns)) {
            fns.forEach(fn=>{
                fn(data);
            })
        }
        return this;
    }
    // 解绑
    off(type,callback) {
        let fns = this._cache[type];
        if(Array.isArray(fns)) {
            if(callback) {
                let index = fns.indexOf(callback);
                if(index !== -1) {
                    fns.splice(index,1);
                }else {
                    // 清空
                    fns.length = 0;
                }
            }
        }
        return this;
    }
}

vue里面的中央事件总线就与此一样。
vue中央事件总线
写在后面:该文章学习于实现一个Event类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的JavaScript代码示例,用于实现一个事件监听器Event: ```javascript class Event { constructor() { this.listeners = {}; } on(eventName, callback) { if (!this.listeners[eventName]) { this.listeners[eventName] = []; } this.listeners[eventName].push(callback); } emit(eventName, data) { const eventListeners = this.listeners[eventName]; if (eventListeners) { eventListeners.forEach(callback => { callback(data); }); } } off(eventName, callback) { const eventListeners = this.listeners[eventName]; if (eventListeners) { this.listeners[eventName] = eventListeners.filter(cb => cb !== callback); } } } ``` 上述代码定义了一个Event,具有以下方法: - `on(eventName, callback)`:将事件监听器添加到指定的事件名上。 - `emit(eventName, data)`:触发指定事件名的所有监听器,并传递数据给监听器回调函数。 - `off(eventName, callback)`:从指定事件名上移除指定的监听器。 你可以创建一个Event实例,并使用该实例的`on`方法添加监听器,然后使用`emit`方法触发事件,并且使用`off`方法移除不需要的监听器。 以下是一个使用示例: ```javascript const event = new Event(); // 添加事件监听器 event.on('click', data => { console.log('点击事件触发了:', data); }); event.on('hover', () => { console.log('鼠标悬停事件触发了'); }); // 触发事件 event.emit('click', '按钮'); event.emit('hover'); // 移除事件监听器 event.off('click'); ``` 这个示例中,我们创建了一个`event`实例并添加了两个事件监听器。然后,我们通过调用`emit`方法触发了两个事件,并传递了一些数据。最后,我们使用`off`方法移除了`click`事件的监听器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值