vue总线bus的使用和移除注意事项

news/2024/5/8 2:36:18/文章来源:https://blog.csdn.net/qq_23858785/article/details/130394438

vue总线bus的使用和移除注意事项

本文目录

    • vue总线bus的使用和移除注意事项
      • 初始化并封装
      • 发送事件
      • 接收事件
      • 移除事件监听
      • 实际使用
        • 正确测试效果
        • 错误测试效果

初始化并封装

main.js中对bus进行初始化, Bus是一个不具备 DOM 的组件,它具有的仅仅只是它实例方法

Vue.prototype.$bus = new Vue({methods: {emit(event, ...args) {this.$emit(event, ...args);},on(event, callback) {this.$on(event, callback);},off(event, callback) {this.$off(event, callback);}}
});

主要是用on代替$on,也可以使用简化的初始化,如下,组件中也带$即可

Vue.prototype.$bus = new Vue();

组件中可以使用this.$bus可以查看bus的实例

console.log(this.$bus);

发送事件

两个参数,前一个是事件标识,后一个是发送的内容

this.$bus.emit("radioChange", "test");

接收事件

  • 方式一(推荐)
    this.$bus.on('radioChange', this.Aaa);Aaa(ii){console.log("radioChange", ii)
    }
    
  • 方式二(不推荐)
    this.$bus.on('radioChange', res => {console.log("radioChange", res)
    })
    

移除事件监听

如果不移除,每次进入组件都会新建一个bus监听,导致不断重复

在组件的beforeDestroy阶段执行

  • 方式一:只移除本组件的bus监听

    beforeDestroy() {this.$bus.off("radioChange", this.Aaa);
    },
    

    尽管组件 A 和组件 B 的事件处理器名称可能相同,但它们是不同的函数实例。这是因为在每个组件中,这些方法都是组件实例的成员。因此,当一个组件在销毁时调用 off,它不会影响其他组件的事件监听器。

    实际上,每个组件都有自己独立的作用域,this.Aaa() 在组件 A 和组件 B 的上下文中都是指向组件自己的方法。因此,在组件销毁时使用 this.$bus.off('radioChange', this.Aaa) 只会移除当前组件的监听器,不会影响其他组件的监听器。

    如果接收事件使用方式二,是无法使用此方法进行移除的

  • 方式二

    会移除所有事件标识为radioChangebus事件监听

    this.$bus.off("radioChange");
    

    如果要使用这种方式,需要为每个组件都制定名称不同的事件标识
    要避免这种情况,需要为每个组件提供唯一的事件处理函数(发送和接收均使用方式一)

  • 方式三

    移除全部监听,慎用

    this.$bus.off();
    

实际使用

发送组件

<template><div class="page-all"><el-button @click="sendBus">sendBus</el-button><el-button @click="showA = !showA">Turn showA</el-button><el-row style="height: 300px;"><el-col :span="12" v-if="showA"><Ar></Ar></el-col><el-col :span="12"><Br></Br></el-col></el-row></div>
</template><script>
export default {data() {return {showA: true,}},methods: {sendBus(){// console.log(this.$bus);console.log("send");this.$bus.emit("radioChange", "test");},},mounted() {},
}
</script><style scoped></style>
<style></style>

组件A

<template>...
</template><script>
export default {data() {return {}},components: {},methods: {Aaa(ii){console.log("radioChange", ii)}},mounted() {this.$bus.on('radioChange', this.Aaa);},beforeDestroy(){this.$bus.off("radioChange", this.Aaa);},
}
</script>

组件B

<template>...
</template><script>
export default {...methods: {Aaa(ii){console.log("radioChange", ii)}},mounted() {this.$bus.on('radioChange', this.Aaa);},beforeDestroy() {this.$bus.off("radioChange", this.Aaa);},
}
</script>
...

正确测试效果

  1. 先发送radioChange
  2. 销毁A组件,发送radioChange,只有B组件能接收
  3. 生成A组件,发送radioChange,A和B都能收到

错误测试效果

如果A组件没有在销毁前移除事件监听,则经过多次组件的销毁和生成之后,会有多个重复的事件监听,可能造成内存泄漏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_104152.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 867 (Div. 3) (E-G)

Problem - E - Codeforces &#xff08;1&#xff09;题目大意 给你一个字符串&#xff0c;问你让字符串每一对相对应位置都不同的最小操作数是多少&#xff1f;&#xff08;A[i]和A[n - i],A[i 1]和A[n - i - 1]&#xff09; &#xff08;2&#xff09;解题思路 1.首…

十三、51单片机之EEPROM(I2C)

1、EEPROM简介 (1)存储设备类型&#xff1a;ROM、RAM、PROM(可编程ROM)、EPROM(可擦除ROM)、EEPROM(电可擦除ROM)。 (2)为什么需要EEPROM&#xff1f; 某些数据内容我们需要掉电不丢失且在程序运行中可以修改这些数据内容&#xff0c;这就需要用到EEPROM。 (3)EEPROM和flas…

毕业-单片机-嵌入式~三年经历回顾

入行嵌入式软件开发 20年6月疫情第一次缓和、实操51单片机&#xff1b;20年9月郑州实习、温湿度采集类低功耗产品、初次接触ARM Cortex M0/M3 单片机&#xff1b;21年5月毕业来到杭州、不懂应届生的宝贵青春&#xff01;匆匆忙忙进厂&#xff5e;人生中第一个项目&#xff1a;…

简单理解内存分页机制

文章目录 1.CPU寻址方式2.段式内存访问的缺点3.80386两级页表4.PAE三级页表5.x64四级页表6.虚拟内存 思考一个问题&#xff1a;如果没有这样的分页机制时应用程序是怎么访问物理内存地址&#xff1f; 1.CPU寻址方式 Effective Address Base (Index * Scale) Displacement …

CAD DLL 15 crack增加了对SLDASM、FSAT

CAD DLL 15 crack增加了对SLDASM、FSAT 改进的3D&#xff1a; 提高了打开三维文件的速度。 提高了SAT、STEP、SLDPRT、X_T、X_B、OBJ格式的阅读能力。 增加了对SLDASM、FSAT、SAB、SMT、IPT、IFC格式的支持。 增加了导出为SAT、SAB、STL、OBJ格式的功能。 改进了SAT、STE…

在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇

本文使用蓝桥云课&#xff0c;即开即用&#xff0c;如果配置第三方课程资源&#xff0c;通常也在10分钟内完成。 效果如下&#xff1a; 全部参考资料如下&#xff1a; 蓝桥ROS之f1tenth案例学习与调试&#xff08;失败&#xff09; 蓝桥ROS之f1tenth案例学习与调试&#xff…

Salesforce官方_中文学习、考证资源

Salesforce将Trailhead描述为学习热门技能的有趣且免费的平台。该平台有助于缩小技能差距&#xff0c;是所有Salesforce用户的宝藏资源。 Trailhead适合所有学习者。它涵盖了适用于Salesforce任何角色的主题和学习模块&#xff0c;从管理员、开发人员、销售主管到最终用户。学…

第7章 “字典”

1.字典简介 字典是什么&#xff1f; 解答&#xff1a;与集合类似&#xff0c;也是一种存储唯一值的数据结构&#xff0c;但它是以键值对的形式来存储。(键值对是最重要的特性)在Es6中新增了字典&#xff0c;名为Map字典的常用操作&#xff1a;增删改查 const map new Map()/…

免费ChatGPT接入网站-网站加入CHATGPT自动生成关键词文章排名

网站怎么接入chatGPT 要将ChatGPT集成到您的网站中&#xff0c;需要进行以下步骤&#xff1a; 注册一个OpenAI账户&#xff1a;访问OpenAI网站并创建一个账户。这将提供访问API密钥所需的身份验证凭据。 获取API密钥&#xff1a;在您的OpenAI控制台中&#xff0c;您可以找到您…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

Tomcat 配置与部署

http 协议就是 http 客户端和 http 服务器之间通信的协议 , 而Tomcat 就是 java 圈子中最广泛使用的 http 服务器. 下载Tomcat Tomcat官网 Tomcat 的版本 , 和后续的 servlet 版本是强相关的 , 此处使用 tomcat 8 , 对应的 servlet 就是 3.1 下载一个 zip 压缩包解压缩即可 T…

输入 jupyter notebook 报错 ModuleNotFoundError: No module named ‘pysqlite2‘ 解决方案

今天在cmd命令行中输入jupyter notebook想要打开jupyter时&#xff0c;出现了以下问题&#xff1a;即找不到模块‘pysqlite2’。 找到出问题的文件“sessionmanager.py”&#xff0c;发现出问题的地方在于&#xff1a;尝试导入sqlite3没有导致失败 因此&#xff0c;以下是解决…

java反转字符串的方法

1、首先我们定义一个方法&#xff0c;用来反转字符串。用 public static void &#xff08;String&#xff09;方法初始化一个对象&#xff0c;然后使用 private static &#xff08;&#xff09;方法对该对象进行初始化&#xff0c;并检查是否有某个字符串和字符串本身相同&am…

复现Nginx 解析漏洞

目录 漏洞原理 漏洞复现 编译环境 制作图片马 一&#xff1a;随便弄一张图片 二&#xff1a;准备写一个.php文件&#xff0c;写上木马 三&#xff1a;合成图片马 上传图片马 修复漏洞 漏洞原理 1、 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fast…

科大讯飞版ChatGPT开始内测《讯飞星火》

科大讯飞版ChatGPT产品&#xff0c;提前交卷了&#xff01; 就在昨夜&#xff0c;讯飞骤然向开发者提供了内测通道&#xff0c;取名为讯飞星火认知大模型对外开启内测。 还有个神奇的英文名字Spark Desk&#xff0c;据说有“火花桌面智能助手”的意思。 申请的过程很简单。用…

leetcode21 - - 合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…

Docker安装mysql8.0文档

第一步需要安装Docker基础环境&#xff0c;具体可以看看这篇 docker基础篇 第二步&#xff0c;拉取mysql8.0的镜像 docker pull mysql:8.0 第三步&#xff0c;镜像启动和文件挂载 复制下面命令执行&#xff0c;33006是对外访问暴露的端口&#xff0c;当然你也可以设置为3306…

这个假期有这些游戏就不怕无聊了

1、塞尔达传说旷野之息 Switch端的优秀游戏体验不容错过&#xff01; 人气王《塞尔达传说》&#xff01; 被玩家誉为“唯一让人长大后有种回到童年的感觉的作品”。 豆瓣网友写道&#xff1a;“在雨夜&#xff0c;我在寺庙里看到了一条白龙划过天空&#xff0c;在岩壁上看到了…

SpringBoot拦截器的使用

Hi I’m Shendi SpringBoot拦截器的使用 简介 最近要实现一个全局对象的传递&#xff0c;在接口中直接通过增加函数参数来直接使用的这种方式 之前一直使用的是过滤器&#xff0c;但这种需求过滤器是没有办法实现的&#xff0c;过滤器可以给请求注入字符串&#xff0c;但不能…

JavaEE初阶学习:初识网络

1.网络发展史 1.独立模式 独立模式:计算机之间相互独立&#xff1b; 2.网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成业务&#xff0c;就有了网络互连。 网络互连&#xff1a;将多…