vue2知识点:消息订阅与发布

Vue消息订阅与发布 概念:消息订阅与发布的设计思想可以理解为人类社会中的报纸订阅与发布,报纸订阅社先发布报纸,由人类的订阅者接收报纸的原理,整个任务分为订阅者和发布者,A组件想要接收B组件的消息内容,那么A组件此时的角色为订阅者,B组件为消息发布者,A组件订阅者需要提前订阅消息名称以及消息回调接收B组件的消息内容,方法为Pubsub.subscribe,向B组件发送订阅消息,B组件发布消息方法为Pubsub.publish,消息方法名必须一致,以下传递学生姓名案例。2、School组件创建订阅者消息。 阅读详情

在这里插入图片描述

3.23消息订阅与发布

3.23.1知识点总结

在这里插入图片描述

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

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

3.23.2案例

案例:跟全局事件总线一样,利用“消息订阅与发布”实现平行组件间通信,即学生组件发送数据给学校组件

注意点1:由于“消息订阅与发布”可依赖的第三方太多了,这里使用pubsub-js

注意点2:使用语法

消息订阅语法

import pubsub from 'pubsub-js'

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

消息发布语法

import pubsub from 'pubsub-js'

pubsub.publish('hello',666)

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

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

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

写法1:

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

写法2:

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

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

注意点7:如果想传递多个参数,需使用{}
发送方

sendToStudent2(){
  pubsub.publish('hello',{name:this.name, sex:this.sex})
}

接收方

mounted() {
    this.pubId = pubsub.subscribe('hello',(msgName, object)=>{
      console.log('有student1平行组件发布了hello消息,hello消息的回调执行了:',object.name, object.sex)
    })
  }

项目结构

在这里插入图片描述

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
})

App.vue

<template>
	<div class="app">
		<h1>{{msg}}</h1>
		<School/>
		<Student/>
	</div>
</template>

<script>
	import Student from './components/Student'
	import School from './components/School'

	export default {
		name:'App',
		components:{School,Student},
		data() {
			return {
				msg:'你好啊!',
			}
		}
	}
</script>

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

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>

结果展示:

在这里插入图片描述
在这里插入图片描述

本人其他相关文章链接

1.《基础篇第1章:vue2简介》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

2.《基础篇第2章:vue2基础》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

3.《进阶篇第3章:vue进阶-组件》包含组件、自定义事件、插槽、路由等等扩展知识点

4.《基础篇第4章》:使用vue脚手架创建项目

5.vue2知识点:数据代理

6.vue2知识点:事件处理

7.vue2知识点:列表渲染(包含:v-for、key、取值范围、列表过滤、列表排序、vue监视对象或数组的数据改变原理、总结vue数据监测)

8.vue2知识点:计算属性与监听属性

9.vue2知识点:生命周期(包含:生命周期介绍、生命周期钩子、整体流程图详解)

10.vue2知识点:非单文件组件和单文件组件

11.vue2知识点:组件is属性

12.vue2知识点:组件模板定义

13.vue2知识点:组件的props属性、非props属性、props属性校验

14.vue2知识点:组件自定义事件

15.vue2知识点:组件插槽分发

16.vue2知识点:动态组件

17.vue2知识点:混入

18.vue2知识点:浏览器本地缓存

19.vue2知识点:全局事件总线(GlobalEventBus)

20.vue2知识点:消息订阅与发布

21.vue2知识点:nextTick语法

22.vue2知识点:Vue封装的过度与动画

23.vue2知识点:路由

24.vue2知识点:vm调用待$命令介绍

25.vue组件通信案例练习(包含:父子组件通信及平行组件通信)

26.vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解

27.vue2基础组件通信案例练习:待办事项Todo-list案例练习

28.vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存

29.vue2基础组件通信案例练习:把案例Todo-list改成使用自定义事件

30.vue2基础组件通信案例练习:把案例Todo-list改成使用全局事件总线

31.vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布

32.vue2基础组件通信案例练习:把案例Todo-list新增编辑按钮

33.vue2基础组件通信案例练习:把案例Todo-list改成使用动画与过度

34.学习vue2遇到过的问题及个人总结

Vue 消息订阅与发布 使用 这一节学习Vue 消息订阅与发布,要实现和上一节相同的功能,在 Student 中向 School 组件发送学生姓名 1、首先安装 pubsubjs,执行 npm i pubsub-js pubsubjs 一个利用 JavaScript 进行发布/订阅的库 2、由于是 School 需要接收订阅消息,所以在 School 中先引入 pubsubjs,然后订阅和取消订阅消息 <template> <!--组件的结构--> <div class="school"&gt 阅读详情

相关推荐

脑机接口(BCI)从原理到开发实战 10|脑控外设:用脑电波控制机械臂/游戏

摘要: 脑机接口(BCI)的“最后一公里”是将分类结果转化为实际动作的关键环节。本文介绍如何通过指令映射、硬件通信和执行反馈实现脑控外设,包括离散/连续控制策略、防抖处理及串口/蓝牙通信方法。通过两个实战案例(运动想象控制机械臂抓取、P300/SSVEP控制游戏)和完整项目(OpenBCI控制小车),演示了从分类标签到设备动作的完整流程,重点涵盖指令生成算法(多数投票)、Python与Arduino的串口通信集成,为BCI系统落地提供实用解决方案。(149字)

小明的博客 756

Vue学习笔记二

1、vue的数据代理   通过vm对象来代理data对象中属性的操作(读/写)   Vue中数据代理的好处:更加方便的操作data中的数据 基本原理:   通过Object.defineProperty()把data对象中所有属性添加到vm上。   为每一个添加到vm上的属性,都指定一个getter/setter。   在getter/setter内部去操作(读/写)data中对应的属性 <!DOCTYPE html> <html> <head> <meta

qq_1763467007的博客 750

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 487

Vue中$vm.nextTick的简单理解

首先,我们可以参考一下官网的解释 : 将回调推迟到下一个 DOM 更新周期之后执行。在更改了一些数据以等待 DOM 更新后立即使用它。 说了一堆,怎么解释这句话,我觉得上代码是最好解释的 <template> <div id="app"> <h1 ref="hello">{{value}}</h1> </div> </template> <script> export default { name:

qq_38755190的博客 1457

数据结构课程设计--基于知识图谱的中医食疗数据管理与应用

【代码】数据结构课程设计--基于知识图谱的中医食疗数据管理与应用。

M_inherit的博客 555

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1101

Vuejs vm对象详解

Vuejs vm对象详解 vue数据是怎么驱动视图的?一堆数据放在那里是不会有任何作用的,它必须通过我们的View Model(视图模型)才能操控视图。 图中的model其实就是数据,一般我们写成js对象的格式; 中间的这个所谓View Model,就是 var vm = new Vue({ el: '#app', data: { message: 'Hello Vue!' ...

weixin_30733003的博客 1413

华为OD机试真题2025双机位A卷 C++ 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 667

Vue——消息的订阅与发布

一种组件间通信的方式,适用于。//订阅消息,编写回调函数。(A是订阅者,B是发布者)2.发布消息︰消息内容。1.订阅消息∶消息名。

mantou_riji的博客 2708

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

Cadence 批量一次性修改title 页码标题

本文介绍如何在Cadence软件中对DSN文件进行标题栏的批量编辑操作,包括选择编辑对象、使用快捷键打开属性面板以及如何修改标题、页码等关键信息。

tianpu2320959696的博客 969

Vue中的消息订阅与发布

消息订阅与发布模式是一种设计模式,它定义了对象间的一对多依赖关系。当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。发布者(Publisher):负责发布消息,但不关心谁接收消息订阅者(Subscriber):订阅感兴趣的消息,并定义处理逻辑消息中心(Event Bus):作为中介,负责管理订阅关系和消息分发if (!},},特性Vue2Vue3核心实现Vue实例作为事件总线第三方库(如mitt)或自定义生命周期管理。

weixin_46282323的博客 1476

AutoSAR系列讲解(实践篇)7.3-AppL在Dev中的配置(下)

接着讲解Dev中剩下的几个定义项

雪云飞星的博客 1万+

[Vue]消息的订阅与发布

1. 消息的订阅与发布 1.1 简介 1.2 pubsub-js 1.2.1 安装 1.2.2 引入 1.2.3 订阅消息 1.2.4 发布消息 1.2.5 取消订阅 2. 消息的订阅与发布实现组件通信 3. 消息的订阅与发布 总结

emmmm..... 1452

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Vue】消息订阅与发布_pubsub & TodoList 编辑事件

任意组件间通信</span>。使用步骤:引入:接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的<span style="color:red">回调留在A组件自身。

2301_80636070的博客 1196

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[vue3] 消息的订阅与发布

消息的订阅与发布

沫洺的博客 2157

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Vue53 消息订阅与发布

/ console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)console.log('我是School组件,收到了数据',data)接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的。最好在beforeDestroy钩子中,用。一种组件间通信的方式,适用于。回调留在A组件自身。

道友 738

消息订阅与发布

消息订阅与发布,也是组件间的一种通信方式,适用于任何组件间通信。 看下面具体的例子。 父组件:App。 <template> <div class="app"> <Company/> <Employee/> </div> </template> <script> import Company from "./components/Company.vue"; import

richest_qi的博客 2660

Vue2.0 消息订阅与发布

Vue2.0 消息订阅与发布

yasinawolaopo的博客 722

vue进阶-消息的订阅与发布

pubsub消息发布订阅适用于任何组件间通信,非常好用

weixin_40017062的博客 2574

vue2过渡与动画和消息的订阅与发布

Vue的过渡动画允许你定义一个进入和离开的过渡,然后在元素的状态改变时自动应用这些过渡,提升用户体验。它通过标签 这个内置组件,在元素或组件的插入、更新和移除时应用过渡效果(也就是动画),可以通过 CSS 过渡或动画类来实现这些效果。这里来简单记录一下。

g_xlike的博客 703
上一篇: vue2知识点:全局事件总线(GlobalEventBus)
下一篇: vue2知识点:nextTick语法
刘大猫.
博客等级 码龄9年 6万+粉丝 730原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘大猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值