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

news2024/9/22 11:33:19

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.coloradmin.cn/o/465314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法 | 最长回文子串

思路&#xff1a;遍历字符串&#xff0c;对于字符串的每个字符&#xff0c;维持两个游标&#xff08;left&#xff0c;right&#xff09;&#xff0c;找到游标对应字符相等时就同速度向两边扩散。 对于 奇数长度子串&#xff0c;left right 对于偶数成都子串&#xff0c;lef…

RocketMq消息

消息发送 发送同步消息 public class SyncProducer {public static void main(String[] args) throws Exception{DefaultMQProducer producernew DefaultMQProducer(/*please_rename_unique_group_name*/"group1");producer.setNamesrvAddr("localhost:9876&q…

复现Nginx 解析漏洞

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

一篇文章告诉你金融行业如何高效管理文件

由于金融行业的行业属性&#xff0c;信息安全万分重要。因此在文件管理工具时&#xff0c;要注意数据安全问题&#xff0c;那么金融行业如何高效管理文件呢&#xff1f; 首先金融行业在文件管理时可能面临以下问题&#xff1a; 1&#xff0c;资料繁杂&#xff0c;整理困难&…

Unity Camera -- (3)控制相机能看到的东西

使用剪裁平面&#xff08;Clipping Planes&#xff09;定义相机可视范围 Clipping Planes定义了相机所能看到的场景范围。在有些时候&#xff0c;限制相机所能看到的范围是出于风格上的考量&#xff0c;但编辑Clipping Planes的主要目的是为了优化性能。相机所需要渲染的东西越…

什么是低码平台?低代码平台能解决什么问题?

低代码平台是近年来日益流行的一种新型软件开发工具。它们提供了一种更简单、更快速、更具成本效益的方式来构建和部署定制软件应用程序。在本文中&#xff0c;我们将探讨什么是低码平台&#xff0c;它们可以解决什么问题&#xff0c;以及它们为什么变得如此流行。 一、什么是低…

第十六章 命令模式

文章目录 前言一、命令模式解决智能生活项目设计思想完整代码Command 所有命令的父接口&#xff08;绑定命令都需要实现&#xff09;LightReceiver 命令接受者LightOnCommand / LightOffCommand 将具体的命令进行绑定空命令命令调用者Clint 测试 添加新的命令&#xff0c;非常简…

【信息安全案例】——身份与访问安全(学习笔记)

&#x1f4d6; 前言&#xff1a;一位用户对计算机信息资源的访问活动中&#xff0c;首先必须拥有身份标识&#xff0c;通过该标识鉴别该用户的身份&#xff0c;进一步地&#xff0c;用户还应当具有执行所请求动作的必要权限&#xff0c;系统会验证并控制其能否执行对资源试图完…

Human Pose Regression with Residual Log-likelihood Estimation

Abstract 通过似然热图对输出分布进行建模的基于热图的方法在人体姿态估计领域占据主导地位。相比之下&#xff0c;基于回归的方法更有效&#xff0c;但效果较差。 在这项工作中&#xff0c;我们探索了最大似然估计&#xff08;MLE&#xff09;&#xff0c;以开发一种高效有…

基于朴素贝叶斯的垃圾邮件分类系统项目开发教程

项目资源下载 基于朴素贝叶斯的垃圾邮件分类系统源码 项目简介 本项目基于朴素贝叶斯算法来解决垃圾邮件分类问题&#xff0c;并使用混淆矩阵进行了验证&#xff0c;得到了非常好的准确率和召回率&#xff08;96%和97%&#xff09;。此外还开发了一个可视化的垃圾邮件分类系统…

前端通过ajax上传文件到七牛云

1. 从服务端获取七牛云上传的token,生成token参考官方文档https://developer.qiniu.com/kodo/1208/upload-token 2. 在七牛云文档查找上传的存储区域 https://developer.qiniu.com/kodo/1671/region-endpoint-fq 在七牛云控制台找到空间管理的cdn加速域名https://portal.qiniu…

【Thinkphp 6】框架基础知识

文章目录 环境搭建框架基础规则继承引入单应用模式多应用模式自定义路由调试器空控制器 视图模板引擎安装渲染模板facade代理变量传递view.php语法查看编译后的文件默认值数组按键取值md5加密 请求request信息参数接收生成URL 文件上传上传及验证 验证功能验证器表单令牌 中间件…

android不可不知调试技巧

目录 1、条件断点 2、评估表达式&#xff08;Evaluate Expression&#xff09; 3、日志断点 4、方法断点 5、异常断点 6、Field WatchPoint 1、条件断点 假设我们列表循环的某个元素时候才暂停&#xff0c;就用这种方式。具体方式在循环列表打断点&#xff0c;对着断点右…

Nginx简介和快速入门

前言: 在一个小型的个人博客网站中&#xff0c;因为没什么流量&#xff0c;并发量小&#xff0c;一般可以直接在一个服务器上的tomcat中直接运行jar包.由tomcat直接响应给客户。 到后面之后随着流量的增大&#xff0c;一台服务器的资源不够用了&#xff0c;此时就需要再多开一…

浏览器渲染页面的原理及流程

1、渲染引擎首先通过网络获得所请求文档的内容 2、解析HTML文件&#xff0c;构建 DOM Tree 3、解析CSS&#xff0c;构建 CSSOM Tree(CSS规则树) 4、将 DOM Tree 和 CSSOM Tree合并&#xff0c;构建Render tree(渲染树) 5、reflow(重排、回流)&#xff1a;根据Render tree进行节…

功率器件的仿真评估

功率器件的仿真评估 1.功率器件仿真评估概述2.IGBT温升模型整理3.Matlab仿真计算4.仿真评估报告 1.功率器件仿真评估概述 功率器件的仿真评估共五个步骤&#xff1a; a.根据IGBT数据手册整理中热阻参数、开关损耗参数温升模型&#xff1b; b.带入到Matlab中仿真堵转、中速运行…

一键免费部署你的私人 ChatGPT 网页应用

主要功能 在 1 分钟内使用 Vercel &#xff08;https://vercel.com/&#xff09;免费一键部署精心设计的 UI&#xff0c;响应式设计&#xff0c;支持深色模式极快的首屏加载速度&#xff08;~100kb&#xff09;海量的内置 prompt 列表&#xff0c;来自中文和英文自动压缩上下文…

CUDA下载,以及下载GPU版本的pytorch

一、下载anaconda 因为这步我之前就下好了&#xff0c;主要参考这个链接&#xff1a;史上最全最详细的Anaconda安装教程 二、下载CUDA 1.首先观察自己需要什么版本的CUDA&#xff0c;以及是否安装过CUDA 先cmd&#xff0c;输入命令 nvidia-smi结果如下&#xff0c;所以我们…

论文笔记:Hidden Markov Map MatchingThrough Noise and Sparseness

sigspatial 2009 1 方法介绍 1.0great circle和route距离 1.1 和ST-matching的比较 1.1.1 转移概率和观测概率 和同一年的ST-matching很类似&#xff0c;也是使用HMM来进行路网匹配论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST…

【Redis7】Spring Boot集成Redis(重点:集成RedisTemplate)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 Spring Boot集成Redis&#xff0c;包括Jedis、lettuce、集成RedisTemplate、集群时一台master宕机&#xff0c;java报错的情况分析。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文…