js 事件发布订阅销毁

在vue中 通过$on订阅事件,通过$emit触发事件以此可用来事件跨组件传值等功能,但是有个弊端就是通过这种方式订阅的事件可能会触发多次。

特别是通过$on订阅的事件中如果有http请求,将会造成触发一次会发出很多同样的http请求,造成资源浪费。

因此 对事件机制做出一下改造,保证同一个事件触发一次,订阅的事件只执行一次

代码如下:

class Event{
    handlers = {};
    on(eventType,handleObj){
        if (!this.handlers[eventType]){
            this.handlers[eventType] = {};
        }
        this.handlers[eventType][handleObj.name] = handleObj.fun;
        return this;
    }
    emit(...data){
        // 第一个参数为:事件类型(eventType)剩下的为参数params
        let eventType = data[0], params = data.slice(1);
        if (this.handlers[eventType]){
            for (name in this.handlers[eventType]){
                this.handlers[eventType][name].apply(this, params)
            };
        }else{
            console.error(`没有订阅 ${eventType} 事件`)
        }
        return this;
    }
    off(...data) {// (‘事件类型‘,‘事件1name‘,‘事件2name‘,‘事件3name‘,...)
        let eventType = data[0], handles = data.slice(1);
        handles.forEach(handName=>{
            delete this.handlers[eventType][handName]
        });
        return this;
    }
}
export default new Event();

event.js

  在vue项目中的使用:

  首先在min.js中引入event.js

  然后赋给vue.prototype

  具体操作如下:

  import E from ‘./utils/event‘

  import E from ‘./utils/event‘

  在组件中使用:

  

 1 /**
 2  * 订阅事件
 3  */
 4 this.E.on(‘hahaha‘, {
 5     name: ‘hahaha_test‘,
 6     fun: (a, b, c) => {
 7         debugger
 8     }
 9 });
10 this.E.on(‘hahaha‘, {
11     name: ‘hahaha_test1‘,
12     fun: (a, b, c) => {
13         debugger
14         // 销毁 hahaha_test 事件
15         this.E.off(‘hahaha‘, ‘hahaha_test‘);
16     }
17 });
18 /**
19  * 触发
20  */
21 this.E.emit(‘hahaha‘, 1, 2, 3)

  

  

原文地址:https://www.cnblogs.com/helloluckworld/p/11378617.html

时间: 2024-10-09 03:28:01

js 事件发布订阅销毁的相关文章

JS的发布订阅模式

JS的发布订阅模式 这里要说明一下什么是发布-订阅模式 发布-订阅模式里面包含了三个模块,发布者,订阅者和处理中心.这里处理中心相当于报刊办事大厅.发布者相当与某个杂志负责人,他来中心这注册一个的杂志,而订阅者相当于用户,我在中心订阅了这分杂志.每当发布者发布了一期杂志,办事大厅就会通知订阅者来拿新杂志.这样在结合下面的图应该很好理解了. 其实就是将发布者和订阅者解耦了,在实际开发中,经常会遇到某个方法内处理很多的逻辑,最简单的就是直接在方法内直接写.这种是高度耦合的面向过程的写法.对于代码维护

nodejs事件发布/订阅Emitter的使用

nodejs事件发布/订阅Emitter的使用 by 伍雪颖 var events = require('events'); var emitter = new events.EventEmitter(); emitter.on("event1",function (message) { console.log(message); }); emitter.emit('event1',"I am message");

异步编程解决方案之事件发布/订阅模式

时间监听模式是广泛用于异步编程的模式,是回调函数的事件化,又称不发订阅模式. nodejs的events模块就是发布订阅模式的一个简单实现,不存在preventDefault,stopPropagation,stopImmediatePropagation,等控制事件传递的方法. 它具有addListner/on(),once(),removeListner(),removeAllLisetner()和emit等基础监听事件方法. 事件发布/订阅十分简单,如下: //订阅 emitter.on(

4.js模式-发布-订阅模式

1. 发布-订阅模式 var observe = (function(){ var events = {}, listen, trigger, remmove; listen = function(key,fn){ if(!events[key]){ events[key] = []; } events[key].push(fn); }; trigger = function(){ var key = Array.prototype.shift.call(arguments); var fns

JS模式之发布/订阅模式

有时在JS中需要定义特定的事件,这些事件可以传递自定义参数.此时可以采用发布/订阅模式. 发布/订阅模式简单实现如下: <script type="text/javascript"> var pubsub = {}; (function($) { $.topics = {}; // 发布或广播事件 $.publish = function (topic, args) { if (!$.topics[topic]) return false; if ($.topics[top

JS 设计模式之发布-订阅

1.JS ES6 定义类,并包含两个方法:subscribe(订阅).publish(发布). class PubJs { constructor () { // 订阅名称列表 this.event_list = {}; } // 订阅 subscribe (eventName, callback) { } // 发布 publish (eventName, ...args) { } } 2.编写订阅者基础逻辑: 允许订阅者订阅信息: 如果当前订阅关键字已存在,则更新订阅回调,否则,新增关键字,

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

Android EventBus发布/订阅事件总线

做过Android开发都会陆续用到这个开源库EventBus.EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅.以及将发送者和接收者解耦.下载EventBus的类库源码:https://github.com/greenrobot/EventBus.下面说说简单用法. 本文项目资源下载: 一.先定义一个消息实体类MainSe

JavaScript设计模式之----原生JS实现简单的发布订阅模式

第一部分: 发布订阅模式简介 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模式. 发布—订阅模式可以广泛应用于异步编程中,是一种替代传递回调函数的方案.比如,可以订阅ajax请求的error.success等事件.或者如果想在动画的每一帧完成之后做一些事情,可以订阅一个事件,然后在动画的每一帧完成之后发布这个事件.在异步编程中使用发布—订阅模式,就无需过