vue全局事件总线和消息订阅详细讲解
全局事件总线
在写组件的时候,我们都知道父传递子
也知道子传递给父
但是组件间嵌套复杂的时候我们应该怎么通信呢?
有的小伙伴会说适用vuex,的确是可以解决问题的
下面我们说一下全局事件总线
一种组件间通信的方式,适用于任意的组件间通信。适用于任意的组件间通信。适用于任意的组件间通信。
场景描述
a-test组件向b-test传递数据.
我们就需要使用全局事件总线。$\color{red}{全局事件总线,不仅可以用在兄弟组件中,还可以是其他关系}$
全局事件总线非常简单
通过this.$bus.$emit('事件名',数据)进行提供数据
通过this.$bus.$on('事件名',(data)=>{ })接受数据
通过接受数据方的组件中销毁对应的事件
beforeDestroy() {
this.$bus.$off('hello')
},
全局事件总线第一步: main.js中注入
// demo就是 vueComponent
// 因为 Vue.extend({})的返回值就是 vueComponent
let Demo = Vue.extend({})
// d就是vueComponent的实例对象哈
let d = new Demo();
Vue.prototype.x=d
我们需要有一个副本或者说傀儡来进行存放[通知]
我们将它放在vueComponent这个实例上
感觉这样写有点麻烦,后面我们想办法优化一下
第二步: a-test发送数据
<template>
<div class="flexflex">
<el-button @click="gievHander">将数据传递给b-test组件</el-button>
<h2 >我是a-test组件</h2>
</div>
</template>
<script>
export default {
methods:{
gievHander(){
this.x.$emit('hello',666)
}
},
}
</script>
第三步:b-test组件接受数据
<template>
<div class="btest">
<h2>我是b-test组件</h2>
<div>传递过来的数据 {{ getDaoData }}</div>
</div>
</template>
<script>
export default {
data(){
return {
getDaoData:''
}
},
mounted(){
this.x.$on('hello',(data)=>{
// hello是监听的事件名称,
console.log('监听的事件数据',data )
this.getDaoData=data
})
},
}
</script>
将第一步进行优化
虽然上面这样的写法虽然是可以的。
但是不够简洁。我们需要将main.js优化一下
new Vue({
router,
render: (h) => h(App),
<!-- 添加下面这四行行代码 -->
beforeCreate() {
// 生命周期中的this指向的是vue实例
//安装全局事件总线;x最好改为$bus
Vue.prototype.x=this
}
}).$mount("#app");
第三步:持续优化
当这个组件销毁的时候,我们应该将事件销毁
<template>
<div class="btest">
<h2>我是b-test组件</h2>
<div>传递过来的数据 {{ getDaoData }}</div>
</div>
</template>
<script>
export default {
data(){
return {
getDaoData:''
}
},
mounted(){
this.x.$on('hello',(data)=>{
// hello是监听的事件名称,
console.log('监听的事件数据',data )
this.getDaoData=data
})
},
beforeDestroy() {
//组件销毁的时候,销毁对应的事件
this.x.$off('hello')
//注意 this.x.$off()表示销毁事件总线的所有事件
},
}
</script>

消息订阅与发布
有的同学可能会问,处了使用刚刚提供的哪一种,还有其他方法吗?
还真的有,只不过需要依赖第三方库!
cnpm i pubsub-js 需要安装一下这个库
安装后,需要引入一下。
订阅: pubsub.publish(消息名,数据)
接受:pubsub.subscribe(消息名,(msgName,data)=>{})
销毁: pubsub.unsubscribe('xx')
a-test发送数据
<template>
<div class="flexflex">
<el-button @click="gievHander">将数据传递给b-test组件</el-button>
<h2 >我是a-test组件</h2>
</div>
</template>
<script>
import pubsub from 'pubsub-js'
export default {
methods:{
gievHander(){
pubsub.publish('dingyueming','发布消息啦')
}
},
}
</script>
b-test接受数据
<template>
<div class="btest">
<h2>我是b-test组件</h2>
<div>传递过来的数据=> {{ getDaoData }}</div>
</div>
</template>
<script>
import pubsub from 'pubsub-js'
export default {
data(){
return {
getDaoData:'',
pubId:''
}
},
mounted(){
this.pubId=pubsub.subscribe('dingyueming',(msgName,data)=>{
// 第一个参数是订阅的名称 msgName
// 第二个参数是数据
this.getDaoData=data
})
},
// 组件销毁的时候,取消订阅
beforeDestroy() {
pubsub.unsubscribe(this.pubId)
},
}
</script>

vue全局事件总线和消息订阅详细讲解的更多相关文章
- 组件通信之全局事件总线 & 消息订阅发布
全局事件总线 介绍 一种组件间通信的方式,适用于任意组件间通信. 在使用全局事件总线之前需要一些知识准备 所有组件实例的原型对象的原型对象就是 Vue 的原型对象,即VueComponent.prot ...
- Vue学习之--------全局事件总线(2022/8/22)
文章目录 1.全局事件总线基础知识(GlobalEventBus) 2.图解过程 3.代码实例 3.1 main.js 3.1 App.vue 3.2 School.vue 3.3 Student.v ...
- 如何在 pyqt 中实现全局事件总线
前言 在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景: 我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡 ...
- vue中央事件总线eventBus的简单理解和使用
公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...
- vue3+ts 全局事件总线mitt
Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...
- C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- vue - Vue脚手架/消息订阅与发布
今天的内容有意思了,朋友们继续对我们之前的案例完善,是这样的我们之前是不是靠props来完成父给子,子给父之间传数据,其实父给子最好的方法就是props但是自给父就不是了,并且今天学下来,不仅如此,组 ...
- Vue学习之--------消息订阅和发布、基础知识和实战应用(2022/8/24)
文章目录 1.基础知识 2.代码实例 2.1 main.js 2.2 School.vue 2.3 Student.vue 2.4 App.vue 3.全局事件总线通信改为消息的订阅和发布 3.1 核 ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
- Vue事件总线
一 项目结构 二 main.js import Vue from "vue"; import App from "./App.vue"; import Tool ...
随机推荐
- 网站web服务器个人博客站开通那些端口合适?
一般网站服务器,只需要开通80 443,(ssh端口默认22,,建议修改) ping命令没有端口,因为ICMP 协议没有到tcp层,仅走ip层,由于IP层协议是一种点对点的协议,而非端对端的协议,它提 ...
- Kubernetes(K8S) helm 安装
Helm 是一个 Kubernetes 的包管理工具, 就像 Linux 下的包管理器, 如 yum/apt 等, 可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上. Hel ...
- Java Sprintboot jar 项目启动、停止脚本
将 vipsoft-gateway-1.0.0 替换成自己的包名 start-gateway-dev.sh nohup java -Duser.timezone=GMT+08 -Dfile.encod ...
- selenium 访问无等待
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities desired_capabilities ...
- Nginx 代理后,打开新窗口,报404,开发环境下没有问题
解决办法: router/index.js文件中, 将 router 的 mode 属性设置为 hash,不要使用 history
- vue setup响应式变量
setup响应式变量 一.非响应式变量 1 效果 开发中发现setup()中的变量居然不是响应式的,值得内容变成1了但是页面上还是0 2.源码 二.响应式变量 1.效果 使用ref()可以声明响应式的 ...
- vue-element-admin完整开源项目介绍、本地部署和初步探索
1 说明: 1.1 从一个广受好评的开源项目:vue-element-admin的本地化,来初步分析vue的相关知识. 2 github地址和下载本地部署: https://github.com/Pa ...
- 【Qt】开源一键代码开光神器,一行代码给你的项目施加祝福,减少Bug
年底啦,没什么项目,想摸鱼划水没见到什么好玩的东西,看到有人分享这个,直接做个库来玩下,之后说不定会嵌到公司的项目里面去.... 效果如下,佛光普照! 输入也只需要一行命令 magic_spells: ...
- ShardingSphere 使用 ShardingJdbc 与 mybatis plus实现分库分表及读写分离
本文为博主原创,未经允许不得转载: 目录: 一. 官网及git 地址 二. Apache ShardingSphere 简介 三.spring boot + mybaits plus +shardin ...
- 基于React开发的chatgpt网页版(仿chatgpt)
在浏览github的时候发现了一个好玩的项目本项目,是github大神Yidadaa开发的chatgpt网页版,该开源项目是跨平台的,Web / PWA / Linux / Win / MacOS都可 ...