vue消息订阅与发布

2023-09-22 09:10:48

1.知识点

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

2.使用步骤

“消息订阅与发布”可依赖的第三方很多,这里使用pubsub-js库

1.安装pubsub:npm i pubsub-js

2.引入:import pubsub from 'pubsub-js'

3.接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件中

   methods(){

     demo(data){......}

 }

 ......

mounted(){

    this.pid = pubsub.subscribe('xxx',this.demo)   //订阅消息 

}

4.提供数据:

   pubsub.publish('xxx',数据)

5.最好在beforeDestroy钩子中,用pubsub.unsubscribe(pid)取消订阅

问题:“全局事件总线”和“消息订阅与发布”都可以实现任意组件间通信,那用哪个好?

 答案:推荐使用“全局事件总线”,因为它是vue提供的,完全使用的vue技术,而“消息订阅与发布”则是第三方。

使用语法

消息订阅 语法

import pubsub from 'pubsub-js'

mounted() {
this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
	// console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data) //msgName为事件名hello data才是接收到的数据
})
},
beforeDestroy() {
	// this.$bus.$off('hello')   
	pubsub.unsubscribe(this.pubId)  //这里注意不是跟全局事件总线一样是hello事件名
}

消息发布 语法

import pubsub from 'pubsub-js'

pubsub.publish('hello',666)

3.注意点:

1.取消订阅方式和“全局事件总线”不同,取消订阅指定订阅返回的id,且每次返回的id都不同,而“全局事件总线”指定的是“自定义事件名称”

2.订阅回调配置一定要使用箭头函数或者外部定义方法,在订阅中引用也行,千万不要使用普通函数,因为普通函数中this不指代vc,而是undefine,这一点跟“全局事件总线”中的注意点很像,但还是略有不同

3.消息订阅会接收到2个参数,第1个参数为消息名称,第2个参数才是传递过来的值,如写法1,但是实际msgName参数1他跟用不到它,所以可使用下划线“_”占个位,如写法2

写法一:

this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
	// console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)
})

写法二:

this.pubId = pubsub.subscribe('hello',(_,data)=>{
	// console.log('有人发布了hello消息,hello消息的回调执行了',_,data)
})

4.箭头函数中的名称(msgName,data)=>{}可以随便写,但是避免使用使用关键字名字

 完整代码

Student.vue(发布方)

<template>
	<div class="student">
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		<button @click="sendStudentName">把学生名给School组件</button>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
		name:'Student',
		data() {
			return {
				name:'张三',
				sex:'男',
			}
		},
		mounted() {
			// console.log('Student',this.x)
		},
		methods: {
			sendStudentName(){
				// this.$bus.$emit('hello',this.name)
				pubsub.publish('hello',666)
			}
		},
	}
</script>

<style lang="less" scoped>
	.student{
		background-color: pink;
		padding: 5px;
		margin-top: 30px;
	}
</style>

School.vue(订阅方)

<template>
	<div class="school">
		<h2>学校名称:{{name}}</h2>
		<h2>学校地址:{{address}}</h2>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
		name:'School',
		data() {
			return {
				name:'尚硅谷',
				address:'北京',
			}
		},
		mounted() {
			// console.log('School',this)
			/* this.$bus.$on('hello',(data)=>{
				console.log('我是School组件,收到了数据',data)
			}) */
			this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
				console.log(this)
				console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)
			})
		},
		beforeDestroy() {
			// this.$bus.$off('hello')
			pubsub.unsubscribe(this.pubId)
		},
	}
</script>

<style scoped>
	.school{
		background-color: skyblue;
		padding: 5px;
	}
</style>

参考文章:vue2知识点:消息订阅与发布_vue2消息订阅与发布_刘大猫.的博客-CSDN博客

更多推荐

通用商城项目(下)

记录一些踩坑的地方,以及理顺一些思路。通过管理系统页面,完成商品属性分组和商品属性(基本属性)关联维护属性表与属性组表的功能完善:显示属性组与属性表的一对多关系前端1.引入组件,是否显示使用v-if,但是还要注意引入的组件本身,是否自己也有:visible.sync="visible"这样的属性。只有当两层是否显示的变

通过内网穿透,在Windows 10系统下搭建个人《我的世界》服务器公网联机

文章目录1.Java环境搭建2.安装我的世界Minecraft服务3.启动我的世界服务4.局域网测试连接我的世界服务器5.安装cpolar内网穿透6.创建隧道映射内网端口7.测试公网远程联机8.配置固定TCP端口地址8.1保留一个固定tcp地址8.2配置固定tcp地址9.使用固定公网地址远程联机今天和大家分享一下只需简

【外汇天眼】外汇交易的优势:公平、低成本和高流动性

外汇交易的优势体现在其公平性以及众多其他方面。让我们一起重新审视这些优势,以更清晰地了解外汇市场的吸引力。1、低成本交易:与其他金融市场不同,外汇市场没有佣金、清算费、交易所费、政府费或经纪费。大多数外汇经纪人通过点差服务获得回报。这意味着交易者可以更高效地管理交易成本。2、无固定手数:与期货市场不同,外汇市场允许交易

【2591. 将钱分给最多的儿童】

来源:力扣(LeetCode)描述:给你一个整数money,表示你总共有的钱数(单位为美元)和另一个整数children,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:所有的钱都必须被分配。每个儿童至少获得1美元。没有人获得4美元。请你按照上述规则分配金钱,并返回最多有多少个儿童获得恰好8美元。如果没有任何分配

【Vue】利用vue.js、vuex和vue router组件、element ui plus组件来创建基于知识图谱的智能问答系统的前端部分

Vue.js是一个流行的JavaScript框架,用于构建用户界面。它基于MVVM模式,可以轻松地创建组件化应用程序。Vuex是Vue.js的官方状态管理库,用于管理Vue.js应用程序中的数据流。它提供了一种集中式的方式来管理应用程序中的所有组件的状态,并且它可以让你轻松地实现可预测的状态变化。VueRouter是V

PostgreSQL serial类型

serial类型和序列postgresql序列号(SERIAL)类型包括smallserial(smallint,short),serial(int)bigserial(bigint,longlongint)不管是smallserial,serial还是bigserial,其范围都是(1,922337203685477

Python实现简单的爬虫功能

目录一、导入必要的库和模块二、发送HTTP请求三、解析HTML文件四、存储数据五、完整代码示例六、注意事项总结随着互联网的普及,信息获取的需求越来越大,而爬虫技术则成为了一种常见的信息获取方式。在Python中,有许多库和模块可以用于实现简单的爬虫功能。本文将介绍如何使用Python实现简单的爬虫功能,包括导入必要的库

std::thread简单使用

std::thread是C++标准库中用于多线程编程的类。它允许你创建和管理线程,使程序能够并发执行不同的任务。以下是关于std::thread的详细介绍以及几个示例说明:创建线程你可以使用std::thread构造函数创建新的线程,并将要执行的函数传递给它。以下是创建线程的基本示例:#include<iostream

c++ 学习 之 静态存储区域 和常量字符串的联系

什么是静态存储区域静态存储区域(StaticStorageArea)是计算机程序运行时用于存储全局变量、静态变量和字符串字面值等数据的一种特殊内存区域。静态存储区域具有以下特点:生存周期:静态存储区域中的数据在程序启动时分配,在程序结束时才会释放。这意味着这些数据在整个程序的执行期间都存在,不会随着函数的调用而创建或销

备战2024秋招面试题-查看Linux的进程

前言:\textcolor{Green}{前言:}前言:💞快秋招了,那么这个专栏就专门来记录一下,同时呢整理一下常见面试题💞部分题目来自自己的面试题,部分题目来自网络整理给我冲学习目标:面试题:算法题:完成?学习目标:Linux有哪些命令查看Linux的进程算法题:排序链表面试题:Linux有那些命令?文件和目录管

四川百幕晟科技:抖店精选联盟怎么使用?

近年来,电商平台的兴起让很多人纷纷加入进来,希望通过在网上销售产品来赚取更多的利润。在这个竞争激烈的市场中,如何找到稳定的渠道来推广自己的产品成为了每个卖家的追求。抖店精选联盟是一个不错的选择,可以帮助卖家快速提升销量。1.如何使用抖店精选联盟?1.注册成为联盟会员首先,您需要在抖店精选联盟官网注册。注册过程比较简单,

热文推荐