Vue 全局事件总线 Event-Bus

news2024/11/15 8:49:39

全局事件总线

 作用:可以在全局层面上,在任意组件之间相互传递数据。不再局限于父子组件传值,或多层嵌套传值等方式。

使用方式:完全与父子组件传值一致,使用 $on 监听事件,使用 $emit 触发事件,使用 $off 解绑事件。

理解

 1、事件总线相当于是独立于所有组件之外的旁观者,不参与组件内的任何逻辑,只负责调用 Vue 实例对象上的方法,且所有组件都能访问到它

2、既然所有组件都能使用事件总线,那我们可以将其定义在两个地方

window直接挂载到 window 全局对象上( 但是会导致污染window 全局对象,可能造成属性混乱 ),且通过 window.x 不能访问到 Vue 实例对象上的 $on 等方法。直接排除

window.x = {a:1,b:2}

Vue 原型对象挂载到 Vue.prototype 上,组件实例对象 和 Vue实例对象都能访问到该属性。

Vue.prototype.x = { a: 1, b: 2 };

3、在 Vue 原型对象,以及 组件实例对象上都是不存在这个东西的,但是我们又需要使用 Vue 实例对象上的 $on、$emit、$off 等方法,所以这玩意应该继承了 Vue 原型对象,或者 组件实例对象

4、继承 组件实例对象 ,或 Vue 原型对象 ( 在 main.js 中挂载 )

继承  VueComponent组件实例对象

// 通过 Vue.extend({}) 返回 VueComponent 构造函数
const Demo = Vue.extend({})

// 通过 new Demo() 得到 VueComponent 构造函数 的实例对象
const d = new Demo()

// 将 VueComponent 构造函数 的实例对象 挂载到 Vue.prototype 实例对象上
Vue.prototype.x = d;

 继承 Vue 实例对象:

// 如果这样写,那肯定是错误的,因为 new Vue() 已经完成,且挂载了,这个时候再去向 Vue.prototype 添加属性会报错
const vm = new Vue({
  render: (h) => h(App),
}).$mount("#app");

Vue.prototype.x = vm;

 使用 beforeCreate 生命周期钩子函数,在 Vue 实例创建之前,向  Vue.prototype 中添加属性。

new Vue({
  render: (h) => h(App),
  beforeCreate() {
    // 当前 this 就是 new Vue() 实例,这是 Vue 底层设计,在生命周期钩子函数中,this都是指向当前 Vue实例对象 或 组件实例对象
    Vue.prototype.x = this
  }
}).$mount("#app");

 继承 组件实例对象 ,或 Vue 原型对象 都可以使的 事件总线对象访问到 $on、$emit 等Vue 底层的方法。但是看写法来说,肯定是使用  beforeCreate 生命周期钩子函数好啊

用法

因为 上面已经 通过 beforeCreate 生命周期钩子函数 使得 事件总线对象 继承了 底层方法,所以下面可以直接使用

定义 School 子组件。在 mounted 钩子函数中,注册了 hello 事件,且进行监听

<template>
  <div class="demo">
    <p>School子组件</p>
  </div>
</template>

<script>
export default {
  mounted() {
    this.x.$on('hello', (data) => {
      console.log('我接受到了数据',data)
    })
  },
};
</script>

定义  Student 子组件。点击 test 之后 触发 hello 事件,传递数据给 School 子组件

<template>
  <div class="demo">
    <p @click="test">Student子组件</p>
  </div>
</template>

<script>
export default {
  methods: {
    test() {
      this.x.$emit('hello','123')
    },  
  },
};
</script>

定义App 组件,

<template>
  <div id="app">
    <School/>
    <Student />
  </div>
</template>

两个兄弟组件之间没有任何关联,但是现在需要 School 子组件 获取到 Student 子组件 传递的数据,这个时候,我们的事件总线就起到作用了。

点击 test 事件,触发 hello 事件,且传递数据。此时控制台上打印出了 Student 传递出的数据。

这个 this.x 只是我随便定义的一个属性,不是固定名称,建议使用 $bus ,类似于 Vue 底层的 $on、$emit 等方法。 

第二种方法:需要新建文件,且使用时每次需要引入文件,较麻烦。只不过一个是在原型上增加属性,一个是直接使用全新的 Vue 实例对象

新建 js 文件:直接暴露 Vue 实例对象

//bus.js
import Vue from 'vue';
export default new Vue();

 引入文件:相当于引入了一个 全新的 Vue 实例对象

import Bus from '@/module/util/bus';

使用:和父子组件传值一样,$on 监听事件 $emit 触发事件

// 监听事件
Bus.$on('getLevelList', data => {
    this.levelList = data;
});

// 触发事件
Bus.$emit('getLevelList', res.data);

建议

如果组件被销毁,建议解绑该组件上的事件,因为事件总线上 监听的事件不会随着组件的销毁而自动解绑,这样可能会造成 事件总线上绑定了过多的 不用监听的事件

beforeDestroy() {
  this.$bus.$off('hello')
},

总结

全局事件总线:

一种组件间的通信方式,适用于任意组件通信( 父子组件,兄弟组件,深层嵌套组件 )

挂载全局事件总线:建议使用该方法,不会增加额外代码,且使用方便

new Vue({
  render: (h) => h(App),
  beforeCreate() {
    Vue.prototype.x = this
  }
}).$mount("#app");

 使用全局事件总线

// 监听事件
this.$bus.$on('hello', (data) => {
  console.log('我接受到了数据',data)
})


// 触发事件,传递数据
test() {
  this.x.$emit('hello','我传递了数据')
},

组件销毁之前解绑事件,避免事件总线上绑定过多无用的事件

beforeDestroy() {
  this.$bus.$off('hello')
},

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

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

相关文章

API测试基础之http协议

http简介&#xff1a; http&#xff08;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP&#xff08;传输控制协议&#xff09;之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出…

Java集合ArrayList详解

ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 Java 数组 与 ArrayList 在Java中&#xff0c;我们需要先声明数组的大…

Jmeter教程

目录 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 二&#xff1a;下载JMeter——配置环境变量 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 1.新建环境变量变量名:JAVA_HOME变量值&#xff1a;&#xff08;即JDK的安装路径&#xff09; 2.编辑Path%J…

Visual Studio 2022的MFC框架——应用程序向导

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…

Pytest自动化测试框架setup 和 teardown

Pytest - setup 和 teardown 执行用例肯定有些需要前置条件或后置操作&#xff0c;例如前置的用户登陆&#xff0c;后置的清理数据等操作&#xff1b; unittest提供了两种前置&#xff08;setup、setupClass&#xff09;和两种后置&#xff08;teardown、teardownClass&#x…

工业生产数据采集器网关是什么?设备如何现场管理?

在制造业数字化转型的浪潮下&#xff0c;工业生产数据采集成为了提高生产效率和质量的关键环节。工业生产数据采集器网关是一种用于连接工厂设备并采集生产数据的智能设备&#xff0c;具备工业级设计和多种联网方式。其中&#xff0c;HiWoo Box作为一款工业边缘网关&#xff0c…

HCIP入门静态实验

题目及要求 第一步&#xff1a;拓扑的搭建 第二步&#xff1a;路由、IP的配置 r1: <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys r1 [r1]int loop [r1]int LoopBack 0 [r1-LoopBack0]ip add 192.168.1.65 27 [r1-LoopBack0]int loop 1 […

Sorting Layer与Order in Layer

就像是两个数相比&#xff0c;比如34与26&#xff0c;Sorting Layer决定的是十位&#xff0c;而Order in Layer决定的是个位&#xff0c;如果Sorting Layer的级别比较高&#xff0c;则可以忽略Order in Layer的比较&#xff0c;当比较的二者的Sorting Layer级别相同&#xff0c…

RF手机天线仿真介绍(一):金属边框天线和LDS天线

目录 简介LDS天线LDS天线仿真 金属边框天线金属边框天线仿真 简介 最早的手机是外置式天线&#xff0c;从NOKIA开始采用内置式天线&#xff0c;开始采用内置金属片&#xff08;一般是0.1MM厚的不锈钢片冲压而成&#xff09;&#xff0c;随后为降低成本&#xff0c;后来改用FPC…

C++ 数组

**数组是具有一定顺序关系的若干对象的集合体&#xff0c;组成数组的对象称为该数组的元素。**数组元素用数组名与带方括号的下标表示&#xff0c;同一数组的各个元素具有相同的类型。数组可以由除void型以外的任何一种类型构成&#xff0c;构成数组的类型和数组之间的关系&…

全排列、子集、组合、子序列

全排列、子集、组合、子序列 1、全排列①回溯&#xff08;DFS&#xff09;交换法②回溯&#xff08;DFS&#xff09;选择法③ 插入法 2、子集①回溯选择法② 动态规划 ③ 位运算方式组合 1、全排列 全排列&#xff08;Permutation&#xff09;&#xff1a;全排列是指给定一组元…

【漏洞复现】Ruijie RG-BCR860 后台命令执行漏洞(CVE-2023-3450)

文章目录 前言声明一、简介二、漏洞概述三、影响版本四、环境搭建五、漏洞复现六、修复方式 前言 Ruijie RG-BCR860 2.5.13 版本存在操作系统命令注入漏洞&#xff0c;攻击者可通过该漏洞获取服务器敏感信息&#xff0c;导致服务器被沦陷。 声明 请勿利用文章内的相关技术从事…

git删除已经提交的大文件

当你不小心把一个巨大的二进制文件提交到git仓库的时候&#xff0c;此时删除再提交也没有用了&#xff0c;大文件已经在仓库中留底了。另外比如需要删除某个需要保密的文件&#xff0c;都是相同的解决办法。 我本来想着把dll放在三方库里面提交到仓库里&#xff0c;省得在不同…

入门级:路由器配置静态路由

软件&#xff1a;cicso packet tracer 8.0 拓扑图&#xff1a;路由器&#xff1a;Router-PT、连接线&#xff1a;Serial DTE、连接口&#xff1a;Serial口&#xff08;serial是串行口,一般用于连接设备,不能连接电脑&#xff09; 实验步骤&#xff1a; 1、构建拓扑图&#xf…

paddlenlp:社交网络中多模态虚假媒体内容核查

初赛之环境配置篇 一、背景二、任务三、数据集1、初赛阶段2、评分标准 四、环境操作五、写在最后 一、背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容大量活跃在媒体内中&#xff0c;与此同时各类虚假信息也充斥着社交媒体&#xff0c;影响着公众的判断和决策。…

re学习(27)攻防世界 re1-100

参考文章&#xff1a;攻防世界逆向高手题之re1-100_沐一 林的博客-CSDN博客 查壳&#xff1a; 用IDA打开&#xff0c;分析 编写脚本&#xff1a; d"{daf29f59034938ae4efd53fc275d81053ed5be8c}" d1d[1:11] d2d[11:21] d3d[21:31] d4d[31:41] print(d3d4d1d2) #…

我去,这是什么黑科技!用信号处理方法抑制瞬态噪声

对于语音增强来说&#xff0c;噪声一般可以分为稳态噪声&#xff08;如白噪声&#xff09;和瞬态噪声&#xff08;有的地方也叫非稳态噪声&#xff0c;如键盘声&#xff09;。如果对语音降噪有一定了解的读者会知道&#xff0c;一般的信号处理方法对稳态噪声比较有效&#xff0…

FreeIPA Server/Client不同版本组合,对podman rootless container的支持

FreeIPA Server/Client不同版本组合&#xff0c;对podman rootless container的支持 根据实验&#xff0c; CentOS 7.9 yum仓库自带的FreeIPA Server 4.6.8&#xff0c; ipa client版本支持CentOS 7.9 yum仓库自带的FreeIPA Client 4.6.8不支持subids&#xff0c;podman调用…

SqlServer2008如何解析Json—附详细代码

1、在数据库中创建存储过程parseJSON&#xff0c;具体文件请在如下链接下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1a-aNmSKk_yvv9wQTP3DCsg?pwdyxwx 提取码&#xff1a;yxwx 2、具体使用方法如下&#xff1a; DECLARE UserParameter NVARCHAR(MAX){"…

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注&#xff1a;这里的集成测试指容器内部的集成测试&#xff0c;非系统间的集成测试)&#xff0c;先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…