美文网首页
自定义事件订阅和发布

自定义事件订阅和发布

作者: xinyiyake | 来源:发表于2019-06-13 16:33 被阅读0次

一个基于ES6 class的事件订阅类方法,可以实现自定义事件订阅、触发和取消订阅:

class Public {
    constructor() {
        this.handlers = {}
    }
    // 订阅事件
    on = function (eventType, handler) {
        if (!(eventType in this.handlers)) {
            this.handlers[eventType] = [];
        }
        this.handlers[eventType].push(handler);
        return this;
    }
    // 触发事件(发布事件)
    emit = function (eventType) {
        let handlerArgs = Array.prototype.slice.call(arguments, 1);
        if (this.handlers[eventType]) {
            for (let i = 0; i < this.handlers[eventType].length; i++) {
                this.handlers[eventType][i].apply(this, handlerArgs);
            }
        }
        return this;
    }
    // 删除订阅事件
    off = function (eventType, handler) {
        let currentEvent = this.handlers[eventType];
        let len = 0;
        // console.log(currentEvent)
        if (currentEvent) {
            len = currentEvent.length;
            // console.log(len)
            for (let i = len - 1; i >= 0; i--) {
                if (currentEvent[i] === handler) {
                    // console.log(currentEvent)
                    currentEvent.splice(i, 1);
                }
            }
            if (currentEvent.length == 0) {
                delete this.handlers[eventType]
            }
        }
        return this;
    }
}

// 测试代码
let Publisher = new Public();
let fn = (fn) => {
    console.log(fn)
}
let fn1 = (fn) => {
    console.log(fn,'哈哈哈哈哈')
}
// 订阅事件a
Publisher.on('a', fn);
Publisher.on('a', fn1);
// 触发事件a
Publisher.emit('a', '我是第1次调用的参数');
//取消事件a的绑定方法fn
Publisher.off('a', fn);
Publisher.emit('a', '我是第2次调用的参数'); 

测试结果:

VM322:2 我是第1次调用的参数
VM322:6 我是第1次调用的参数 哈哈哈哈哈
VM322:6 我是第2次调用的参数 哈哈哈哈哈

相关文章

  • JavaScript自定义事件和发布订阅模式

    在js和JQuery里都可以自定义事件,在我看来自定义事件的核心就是发布订阅模式的实现。所谓的发布订阅模式是Jav...

  • 自定义事件订阅和发布

    一个基于ES6 class的事件订阅类方法,可以实现自定义事件订阅、触发和取消订阅: 测试结果:

  • js实现发布订阅模式

    发布订阅模式指的是希望接收通知的对象(Subscriber)基于一个主题通过自定义事件订阅主题,被激活事件的对象(...

  • jquery技巧之让任何组件都支持类似DOM的事件管理

    1. 发布-订阅模式 很多博客包括书本上都说javascript要实现组件的自定义事件的话,可以采用发布-订阅模式...

  • Vue响应式原理

    Vue2.x 核心响应式原理 Vue3.0 核心响应式原理 Vue 自定义事件 Vue 发布订阅模式 发布/订阅模...

  • EventBus原理解析

    EventBus(发布订阅事件总线):通过解耦发布者和订阅者简化android 事件传递 EventBus is ...

  • Vue父子组件间通信(数据传递)

    父---props--->子子---props/自定义事件/全局事件总线/消息订阅与发布--->父任意组件间通信:...

  • Vue 组件之间通信

    父给子传值 prop 子给父 $emit ref 自定义事件 通过 ref 事件总线: 消息订阅与发布

  • EventBus解读

    EventBus 基础发布者通过EventBus发布事件,订阅者通过EventBus订阅事件。当发布者发布事件时,...

  • EventBus源码(一)

    1、EventBus概述: EventBus是Android中发布订阅事件总线框架,将事件的发布者和订阅者分开, ...

网友评论

      本文标题:自定义事件订阅和发布

      本文链接:https://www.haomeiwen.com/subject/zcesfctx.html