【Vue组件间通信】 全局事件总线、订阅与发布

news2024/11/15 12:20:58

目录

一、全局事件总线

作用

安装

组件使用案例

案例分析

组件一(小明)

组件二(小红)

效果展示

二、订阅与发布 

安装

组件使用案例

案例分析

组件一(小明)

组件二(小红)

效果展示


一、全局事件总线

作用

一种组件间通信的方式 适用于任意组件间通信。

安装

安装全局事件总线:在入口文件main.js中,给VM添加$bus,任意组件都可以在原型中调用。

new Vue({
  render: h => h(App),

  beforeCreate(){
  	  Vue.prototype.$bus  = this
  }

}).$mount('#app')

组件使用案例

案例分析

创建两个子组件,如下组件,其中注释内容是演示订阅与发布无视即可

下面代码所演示的是,小明组件给小红组件姓名“小明”,小红组件给小明组件“年龄”,主要通过自定义事件,其中小明组件自定义“getName”,需要传递给小红组件,小红组件就需要“getName”来接收,也可以销毁传递

发送代码如下

this.$bus.$emit('getName',this.name)//this.name是所要传递的值,

接收代码如下

this.$bus.$on('getName',(name)=>{
            console.log( '小红得到的名字',name);
          })

销毁代码如下

需要一个点击事件来触发

this.$bus.$off('getName')

组件一(小明)

<template>
	<div>
		姓名:{{name}}年龄:{{age}}<button @click="sendMsg">给小红组件传姓名</button> <button @click="del">销毁传递</button>

	</div>
</template>

<script>
	// import pubsub from 'pubsub-js'
	export default {
	  name: 'XiaoMing',
	  data(){
		return{
			name:'小明',
			age:20
		}
	  },
	  methods:{
		  sendMsg(){
			//   pubsub.publish('usname',this.name)

			  this.$bus.$emit('getName',this.name)
		  },
		  del(){
			this.$bus.$off('getName')
			console.log('已销毁');
		  }
	  },
	mounted(){
		// pubsub.subscribe('age',(e,page)=>{
		// 	console.log('小明得到小红',e,page);
		// })
		this.$bus.$on('getAge',(age)=>{
			console.log('小明得到的年龄',age);
		})
	}
	}
</script>

<style>
</style>

组件二(小红)

<template>
	<div>
		姓名:{{name}}年龄:{{age}} <button @click="sendAge">给小明组件传年龄</button><button >取消订阅</button>
	</div>
</template>

<script>
	// import pubsub from 'pubsub-js'
	export default {
	  name:'XiaoHong',
	  data(){
		return{
			name:'小红',
			age:18
		}
	  },
	  methods:{
		sendAge(){
			// pubsub.publish('age',this.age)

			this.$bus.$emit('getAge',this.age)
		},
		// noRead(){
		// 	pubsub.unsubscribe(this.del)
		// }
	  },
	  mounted(){
		//   this.del=pubsub.subscribe('usname',(q,msg)=>{
		// 	  console.log('小红得到小明',q,msg)
		//   }),


		  this.$bus.$on('getName',(name)=>{
			console.log( '小红得到的名字',name);
		  })
	  },	  
	}
</script>
<style>
</style>

效果展示

二、订阅与发布 

安装

一种组件间通信的方式,适用于任意组件间通信,如今有很多消息订阅与发布的包,在这里只介绍一种,pubsub-js。

打开终端输入命令:npm i pubsub-js

组件使用案例

案例分析

通过订阅与发布的方式,小明组件给小红组件姓名,小红组件给小明组件年龄

第一步我们需要引入: import pubsub from 'pubsub-js'

第二步通过在小明组件发布

pubsub.publish('usname',this.name) //usname:发布消息的名称,第二个参数:为发布内容

第三步在小红组件订阅

 this.del=pubsub.subscribe('usname',(q,msg)=>{
			  console.log('小红得到小明',q,msg)
		  })

第四步想要取消订阅,自定义事件,绑定销毁,通过第三步的this.del

pubsub.unsubscribe(this.del)

组件一(小明)

<template>
	<div>
		姓名:{{name}}年龄:{{age}}<button @click="sendMsg">给小红组件传姓名</button> <button >销毁传递</button>

	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
	  name: 'XiaoMing',
	  data(){
		return{
			name:'小明',
			age:20
		}
	  },

	  methods:{
		  sendMsg(){
			  pubsub.publish('usname',this.name)

			//   this.$bus.$emit('getName',this.name)
		  },
		//   del(){
		// 	this.$bus.$off('getName')
		// 	console.log('已销毁');
		//   }
	  },
	mounted(){
		pubsub.subscribe('age',(e,page)=>{
			console.log('小明得到小红',e,page);
		})

		// this.$bus.$on('getAge',(age)=>{
		// 	console.log('小明得到的年龄',age);
		// })
	}
	}
</script>

<style>
</style>

组件二(小红)

<template>
	<div>
		姓名:{{name}}年龄:{{age}} <button @click="sendAge">给小明组件传年龄</button><button @click="noRead">取消订阅</button>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
	  name:'XiaoHong',
	  data(){
		return{
			name:'小红',
			age:18
		}
	  },
	  methods:{
		sendAge(){
			pubsub.publish('age',this.age)

			// this.$bus.$emit('getAge',this.age)
		},
		noRead(){
			pubsub.unsubscribe(this.del)
		}
	  },
	  mounted(){
		  this.del=pubsub.subscribe('usname',(q,msg)=>{
			  console.log('小红得到小明',q,msg)
		  })


		//   this.$bus.$on('getName',(name)=>{
		// 	console.log( '小红得到的名字',name);
		//   })
	  },
	
	  
	}
</script>

<style>
</style>

效果展示

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

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

相关文章

Python爬虫之Web自动化测试工具SeleniumChrome handless

​ ​ 作者 : SYFStrive 博客首页 : HomePage &#x1f967; 上一篇续文传送门 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;如果觉得文章对你有帮助可以点点关注…

Python流星雨代码

前言 用Python画场流星雨看看&#xff0c;源码见文末公众号哈。 流星类 def __init__(self): self.r ra.randint(50,100) self.t ra.randint(1,3) self.x ra.randint(-2000,1000) #流星的横坐标 self.y ra.randint(0,500) #流星…

出道即封神的ChatGPT,现在怎么样了?

从互联网的普及到智能手机&#xff0c;都让广袤的世界触手而及&#xff0c;如今身在浪潮中的我们&#xff0c;已深知其力。前阵子爆火的ChatGPT&#xff0c;不少人保持观望态度。现如今&#xff0c;国内关于ChatGPT的各大社群讨论&#xff0c;似乎沉寂了不少&#xff0c;现在怎…

Web自动化测试怎么做?Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

使用node命令提示: ‘node‘ 不是内部或外部命令,也不是可运行的程序

报错&#xff1a;使用node命令提示: ‘node‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 原因&#xff1a;没安装node.js 或者 没配置好环境变量 情况1&#xff1a;安装node.js&#xff1a; 在官网下载 .msi 文件&#xff1a;Node.js 中文网 (nodejs.cn) 步骤 1 : 下…

使用Freemarker来生成pdf文件

2022-09-02 今天接到一个生成pdf的任务&#xff0c;并且web端要能下载&#xff1b;在网上也找了许多的工具如&#xff1a;itext等&#xff0c;感觉挺复杂的没那么好用&#xff0c;然后想起了之前使用Freemarker来生成world文档&#xff0c;挺好用的&#xff0c;然后调查发现也能…

【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]

&#x1f947;作者 .29. 的✔博客主页✔ &#x1f947;记录JavaWeb学习的专栏&#xff1a;Web专栏 &#x1f947;向前走&#xff0c;不要回头。 您的点赞&#xff0c;收藏以及关注是对作者最大的鼓励喔 ~~ 重新认识Servlet的初始化一、回顾Servlet1.什么是Servlet2.Servlet规范…

设置背景图片大小的方法

背景图片大小设置 语法&#xff1a;background-size:宽度 高度&#xff1b;作用&#xff1a;设置背景图片大小取值&#xff1a; 取值场景数字px简单方便&#xff0c;常用百分比相当于当前盒子自身的宽高百分比contain包含&#xff0c;将背景图片等比例缩放&#xff0c;直到不…

Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

Vue 之 echarts 图表数据可视化的基础使用&#xff08;简单绘制各种图表、地图&#xff09; 目录 Vue 之 echarts 图表数据可视化的基础使用&#xff08;简单绘制各种图表、地图&#xff09; 一、简单介绍 二、环境搭建 三、使用 echarts 四、自动缩放 echarts 五、数据更…

【网络通信】websocket如何断线重连

Vue <template><div><button click"sendDevName(xxxxxxxx)">发送</button>{{data}}</div> </template><script> export default {name: HelloWorld,data () {return {data: null}},// html加载完成后执行initWebSocket()…

Vue3-路由跳转专题详细总结

一、基本路由 点击事件似乎可以使用模板更改视图中的内容&#xff0c;个人认为与路由的区别是路由能使网页中的地址栏发生变化 请先阅读基础第二篇 1.创建一个组件,并引入 2.js文件中配置路径 //name相当于别名{path:/tabView,component:TabView},{name:myComPany,path:compan…

Vue3项目搭建全过程

目录 一、前言 二、搭建准备 三、搭建项目 四、启动项目 一、前言 在2020年的9月19日&#xff0c;万众期待的Vue3终于发布了正式版&#xff0c;命名为“One Piece”。 它也带来了很多新的特性&#xff1a;更好的性能、更小的包体积、更好的TypeScript集成、更优秀的API设…

前端面试真题宝典(一)

面试题真题 闭包和柯里化 闭包是什么&#xff1f;闭包是能够读取其他函数内部变量的函数 柯里化是什么&#xff1f;柯里化是把一个多个参数的函数转化为单参数函数的方法 闭包的用途&#xff1a;闭包的主要用途是为了不污染全局变量&#xff0c;用闭包的局部变量来做一些库…

30个题型+代码(冲刺2023蓝桥杯)(中)

2023.3.13~4.13持续更新 目录 &#x1f34e;注意 &#x1f33c;前言 &#x1f33c;十&#xff0c;KMP&#xff08;留坑&#xff09; &#x1f33c;十一&#xff0c;Trie&#xff08;留坑&#xff09; &#x1f33c;十二&#xff0c;BFS &#x1f44a;(一)1562. 微博转发…

获取街道、镇级的地图geoJson数据方法,使用echarts绘制出街道、镇级的地图区域画面(中山市为例)

一、需求 1、在echarts上绘制市级以下的区、县的区域地图。 2、在市级下很多都是有区、县的区域&#xff0c;而少部分是不存在区、县的&#xff0c;是直接市下面一级就是街道、镇级别的区域。 3、统一管理区域数据&#xff0c;有区县的市直接拿区县的geoJson数据&#xff0c;没…

炸弹人小游戏代码开源(python)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Ajax--》请求操作以及跨域相关讲解

目录 jQuery中的Ajax 请求超时与网络异常处理 取消请求 Ajax请求—fetch() 跨域 jQuery中的Ajax 在jQuery中应该如何发送Ajax请求呢&#xff1f;看到这篇文章你就能大概了解到如何在jQuery中发送Ajax。 要想使用jQuery框架&#xff0c;肯定是需要引进jQuery资源的&#…

CSS实现单行、多行文本溢出显示省略号(…)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、单行超出显示省略号二、多行超出显示省略号一、单行超出显示省略号 描述&#xff1a;如果文字超出父元素指定宽度&#xff0c;文字会自动换行&#xff0c;而连续…

Node.js——文件模块和路径模块(读写文件,处理路径)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿 offer&#xff08;秋招&#xff09; &#x1f947;推荐学习&…

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁3. 死锁排查4. 实例分析4.1 案例描述4.2 案例死锁问题复现4.3 死锁排查4.4 解决死锁5. 如何避免死锁1. 死锁与…