「JS零碎」自定义事件类event

2019-05-14  本文已影响0人  acsamson

目的是为了实现一个事件类event, 包含: 绑定事件, 触发事件, 解绑事件
其实是一个发布订阅模式:


image
class Event {
    constructor() {
        // 为了查找迅速使用了对象
        this._cache = {};
    }

    // 绑定事件
    on(eventName, callback) {
        /* 为了查找方便和节省空间, 把同一类型事件放到数组中
        *  因为数组是有序的, 逻辑上是队列, 先绑定先触发
        * */
        // 如果有就放入, 没有就新建, 然后再看下是否有放入函数,没有就加入
        let fns = (this._cache[eventName] = this._cache[eventName] || []);
        // 如果事件方法没有的话就放入到字典进去
        if (fns.indexOf(callback === -1)) {
            fns.push(callback);
        }
        return this;
    }
    // 触发事件
    trigger(eventName, data) {
        // 看下字典里有没有这个函数名字, 有的话就触发它
        let fns = this._cache[eventName];
        if (Array.isArray(fns)) {
            // 有的话就对立面的每一个function传入参数data
            fns.forEach((fn) => {
                fn(data);
            })
        }
        return this;
    }
    /*解绑, 看下字典里如果有这个事件名字就去
    * 看下要删除什么, 有指定就有, 没有指定就全删除
    * */
    off(eventName, callback) {
        let fns = this._cache[eventName];
        if (Array.isArray(fns)) {
            if (callback) {
                let index = fns.indexOf(callback);
                if (index !== -1) {
                    fns.splice(index, 1);
                }
            } else {
                // 全部清空
                fns.length = 0
            }
        }
        return this;
    }
}

接下来进行订阅者操作, 就是用户操作, 事件绑定和触发

const event = new Event();
event.on('test', (a) => {
    console.log(a);
});
event.trigger('test', 'hello world'); // 绑定后就输出
event.off('test');
event.trigger('test', 'hello world'); // 解绑后就不显示了
上一篇下一篇

猜你喜欢

热点阅读