js 事件发布订阅销毁

2023-10-30

在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'

  Vue.prototype.E = E;

  在组件中使用:

  

 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 指数历年各月涨幅分析-验证五穷六绝七翻身是否可信

    指数通常反映了一个行业或者一类股票的行情数据 本文将对697支指数的历史各月涨幅进行分析 为量化投资作一个参考 从分析中 我们可以验证五穷六绝七翻身是否可信 并找出上涨概率最大的一些指数和月份 1 数据准备 本文程序中用到两个数据 1 in
  • clickHouse MergeTree核心原理

    1 MergeTree的创建方式与存储结构 1 1 MergeTree的创建方式 CREATE TABLE IF NOT EXISTS db table name ON CLUSTER cluster name1 type1 DEFAULT
  • C# 基础程序结构和入门实例(学习心得 2)

    超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 C Hello World 实例 C 最小的程序结构需要包含以下部分 命名空间声明 一个 class 一个 Class 方法 该 Class 方法的属性 一个 Main 方法
  • python中class的作用

    在 Python 中 class 是用来定义对象的类型的 通过定义类 可以创建该类型的多个实例 每个实例都有相同的属性和方法 类也可以继承其它类 并扩展或重写属性和方法
  • 人工智能:未来制胜之道

    在数据 算法 计算 场景驱动新一轮人工智能飞速发展 未来3 5年内人工智能将处于服务智能阶段 即技术边际突破但应用海量拓展 人工智能未来竞争格局将由生态构建者 技术算法驱动者 应用聚焦者 垂直行业先行者 基础设施提供者五类竞争定位模式主导
  • springgateway限流-令牌桶算法

    限流配置 参见 https blog csdn net forezp article details 85081162 https cloud spring io spring cloud gateway 2 2 x reference h
  • 学计算机的感想300字,大学生计算机实训心得体会3篇

    大学生计算机实训心得体会3篇 我们有一些启发后 可以通过写心得体会的方式将其记录下来 这样我们可以养成良好的总结方法 那么心得体会到底应该怎么写呢 下面是小编为大家整理的大学生计算机实训心得体会 欢迎大家分享 大学生计算机实训心得体会1 在
  • 在服务器上下载安装anaconda

    anaconda下载与安装 1 连接到服务器 进入服务器界面 同时连上网络 登录到Anaconda官网 如果你的服务器是Linux系统 选择这一款 2 打开服务器的终端 Open in Terminal 进入命令行输入 bash Anaco
  • DATAX_HOOK,怎么实现的

    DATAX HOOK 怎么实现的 JobContainer 类Datax的job执行类 JobContainer 类 An highlighted block JobContainer 类关于 finally if isDryRun thi
  • 【portainer.io】可视化界面学习

    portainer io 学习目标 学习内容 portaine背景 docker基于界面管理工具Portainer 安装portainer 启动portainer 使用portainer 学习总结 学习目标 学习内容 了解portainer
  • maven当中如何用SpringMVC和mybatis创建一个项目

    创建一个SpringMVC mybatis项目 马克 to win 马克 java社区 防盗版实名手机尾号 73203 下部我们做一个SpringMVC mybatis的例子 我们还是继续刚才项目的底子 参见我的mybatis那一章 这个例
  • 本地ecshop网站怎么上传到服务器,ECSHOP商品批量上传,ECSHOP商品数据包导入

    各位ECSHOP网店系统用户大家好 欢迎来到ECSHOP商品批量上传 ECSHOP商品数据导入设置 第一节 1 1 进入后台管理中心 商品管理 商品批量上传 进入商品批量上传页面 如图所示 1 2 您可以在上图中红色方块区域标注中下载批量上
  • linux protobuf静态库,Mac下交叉编译protobuffer版本库(C++版)

    一 前言 这几天和开发jni的同学对接SDK 其中包含了protobuffer和openssl库 这里主要说一下protobuffer编译mac环境静态库过程及遇到的问题 在此记录下来供后续参考 由于对linux及英文不是很熟 过程中也感谢
  • 如何合并多个工作表或多个工作簿?3种合并方法都在这

    分享三个方法 一分钟搞定 简单 快速 步骤少 总有一个适合你 话不多说 往下看 01 多个工作簿单张工作表的合并 如下图所示 我们有几个区域的销售数据分别放在不同的工作簿中 每个工作簿内只有一张工作表 每个工作簿的表格结构是一致的 现在我们
  • android 防止反编译的若干方法

    第一种方式 混淆策略 混淆策略是每个应用必须增加的一种防护策略 同时他不仅是为了防护 也是为了减小应用安装包的大小 所以他是每个应用发版之前必须要添加的一项功能 现在混淆策略一般有两种 对代码的混淆 我们在反编译apk之后 看到的代码类名
  • vue中父组件异步数据通过props方式传递给子组件,子组件接收不到的问题

    vue中父组件异步数据通过props方式传递给子组件 子组件接收不到的问题 问题描述 组件化开发中经常用到父子组件的通信 父传子子传父等数据的操作 如果父组件的数据是发请求从后端获取的异步数据 那么父组件将这个数据传递给子组件的时候 因为是
  • 超详细的 pytest 教程【入门篇】

    前言 关于自动化测试 这些年经历了太多的坑 有被动的坑 也有自己主动挖的坑 在这里做了一些总结 主要思考总结下这些年来自动化测试过程中的一些基本的东西 例如何时进行自动化 如何自动化 或是怎么自动化我们的测试工作 接下来我们先对pytest
  • idea全局搜索失效,Ctrl+shift+F快捷键不起作用

    方法1 是否与搜狗等输入法软件存在快捷键冲突 当然也可能是你新下载的什么软件导致的快捷键冲突导致IDEA全局搜索失效 比如下图 可以改掉输入法的快捷键或者直接关闭输入法的快捷键 这样idea的全局搜索功能就恢复了 方法2 终极办法 如果你一
  • Leetcode 268. 缺失数字(有效利用异或和)

    缺失数字 给定一个包含 0 1 2 n 中 n 个数的序列 找出 0 n 中没有出现在序列中的那个数 示例 1 输入 3 0 1 输出 2 示例 2 输入 9 6 4 2 3 5 7 0 1 输出 8 class Solution publ
  • js 事件发布订阅销毁

    在vue中 通过 on订阅事件 通过 emit触发事件以此可用来事件跨组件传值等功能 但是有个弊端就是通过这种方式订阅的事件可能会触发多次 特别是通过 on订阅的事件中如果有http请求 将会造成触发一次会发出很多同样的http请求 造成资