《Vue3 基础知识》事件总线 bus(与Vue2 有差异,使用 mitt 库)

前言

Vue2 与 Vue3 事件总线区别

  • Vue2 使用 $on$off$once 实例方法,创建一个事件总线,可在整个应用中做全局事件监听
  • Vue3 移除 $on$off$once 实例方法 ,但提供了解决方案,使用库 mitt 或 tiny-emitter;
  • 注意 Vue3 保留了实例方法 $emit,用于触发由父组件声明式添加的事件处理函数;

解决方案

定义

Vue2 实现

// 文件 bus.js
import Vue from 'vue'const bus = new Vue({});export default bus;

Vue3 实现

题外话, 库 tiny-emitter 最后一次更新是 5年前,库 mitt 更新是 2023.07.05。所以这里选择 库 mitt。

先安装:

npm i mitt

再定义。注意代码 6-9 行 有转换,因为库 mitt 中的方法是带前缀 $,为了与 Vue 方法名兼容使用。

// 文件 bus.js
import mitt from 'mitt'const bus = mitt();// mitt 库中的方法是不带前缀$。为了与 Vue 方法名匹配。此处有转换。
bus.$on = bus.on;
bus.$off = bus.off;
bus.$emit = bus.emit;export default bus;

有个坑

  • Vue2/Vue3 可传多个额外参数;
  • mitt 只能传一个额外参数,建议是 object 类型;

在这里插入图片描述

引入

Vue2Vue3 引入方式一样。

import bus from './bus.js'

使用

Vue2Vue3 使用方式也一样。但有上述提到的传递参数个数问题!

// 触发事件
bus.$emit('foo', 'test');// 监听事件
bus.$on('foo', foo);// 取消监听
bus.$off('foo', foo);// 测试方法
function foo(e) {console.log('foo', e);
}

延伸知识

vm. e m i t 与 b u s . emit 与 bus. emitbus.emit 区别

vm.$emit

  • Vue 实例方法,且 Vue2 / Vue3 都有此方法;
  • 用于子组件父组件传递消息,通过方法 $emit 触发父组件上的自定义事件,并传参数;
  • 可传递任意 多个额外参数;
// 子组件,触发事件
this.$emit('on-param-change', p1, p2);// 父组件,监听事件
<my-parents @on-param-change="onParamChange" />
onParamChange (p1, p2) {console.log(p1, p2);
}

bus.$emit

  • 是上述 库 mitt 的方法,注意原生是 emit,不带 $
  • 可创建一个事件总线,在整个应用中做全局事件监听
  • 只能传递 一个额外参数;
import bus from './bus.js'// 触发事件
bus.$emit('on-param-change', {p1, p2});// 监听事件
bus.$on('on-param-change', (obj) {console.log(obj.p1, obj.p2);
});

如果你没接触过GoGoCode,下小节可忽略

GoGoCode 中的 $emit 方法

GoGoCode 转换文件 /utils/gogocodeTransfer 封装了 $on, $once, $off, $emit 方法。

  • 也是 Vue3 移除 $on$off$once 实例方法 的解决方案之一;

  • 但在自动转换过程中,它把 vm.$emitbus.$emit 的方法都转了;

  • 所以出现了第三种方式;

GoGoCode 兼容 vm.$emit 方法

  • GoGoCode 方式:第一个参数是 this 组件实例对象;
// 使用 gogocode 的写法
import { $on, $off, $emit } from './utils/gogocodeTransfer'$emit(this, 'tool-click', type, num);
  • vm.$emit 方式:可传多个额外参数。如果是父子组件传递消息,推荐此原生方式
// 使用 Vue 原生的写法
this.$emit('tool-click', type, num);

GoGoCode 兼容 bus.$emit 方法

  • GoGoCode 方式:第一个参数是 bus 对象(mitt)。它的有优点是可传递任意多个额外参数;
import { $on, $off, $emit } from './utils/gogocodeTransfer'// 触发事件,bus 是 mitt 对象
$emit(bus, 'on-param-change', p1, p2);// 监听事件,bus 是 mitt 对象
$on(bus, 'on-param-change', (p1, p2) {console.log(p1, p2);
});
  • bus.$emit 方式:注意只能传一个额外参数
import bus from './bus.js'// 触发事件
bus.$emit('on-param-change', {p1, p2});// 监听事件
bus.$on('on-param-change', (obj) {console.log(obj.p1, obj.p2);
});

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

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

相关文章

crossover玩不了qq游戏大厅怎么办 仍有五亿人坚持用QQ crossover玩游戏 Mac电脑玩QQ游戏

从1999年2月&#xff0c;QQ首个版本QICQ&#xff08;OPEN-ICQ&#xff09;上线。到2024年&#xff0c;靠着5亿月活用户&#xff0c;守住社交领域TOP2位置。你还记得QQ经典的铃声吗&#xff1f; 根据月狐数据2023年12月的统计&#xff0c;QQ月活跃账户数比微博和知乎加在一起还要…

分享10个ai人工智能ppt生成软件,一键轻松搞定PPT制作!

ai 人工智能发展至今&#xff0c;已经诞生了各式各样的 AI 软件&#xff0c;最常见的如 AI 写作软件、AI 绘画软件、AI 人工智能 ppt 生成器、AI 人工智能抠图软件等等。对每天要面对各类文档、演示文稿&#xff08;PPT&#xff09;的职场人来说&#xff0c;最被需要的 AI 软件…

颜色检测python项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程。很简单不是吗&#xff1f;嗯&#xff0c;对于人类来说&#xff0c;这是一项极…

教你怎么写苹果群控系统!

在数字化时代&#xff0c;随着智能手机的普及和iOS系统的广泛应用&#xff0c;苹果设备的管理和控制变得日益重要&#xff0c;为了满足这一需求&#xff0c;苹果群控系统应运而生。 一、系统概述 苹果群控系统是一种能够对多台苹果设备进行集中管理和控制的软件系统。通过该系…

2024年会声会影 迎接来了七大新功能

我喜欢Corel VideoStudio 会声会影2024旗舰版&#xff0c;因为它使用起来很有趣。它很容易使用&#xff0c;但仍然给你很多功能和力量。VideoStudio让我与世界分享我的想法&#xff01;“这个产品的功能非常多&#xff0c;我几乎没有触及它的表面&#xff0c;我可以做大量的编辑…

【Linux】权限管理(文件的访问者、类型和访问权限,chmod、chown、chgrp、umask,粘滞位)

目录 00.前言 01.文件访问者的分类 02.文件类型和访问权限 文件类型&#xff1a; 文件基本权限&#xff1a; 03.文件权限值的表示方法 04.访问权限的设置 &#xff08;1&#xff09;chmod &#xff08;2&#xff09;chown &#xff08;3&#xff09;chgrp &#xff0…

Linux:kubernetes(k8s)Deployment的操作(12)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

mysql中 COALESCE和CASE WHEN的使用以及创建或替换视图

create or replace view 自理能力评估视图 as SELECT ehr_zlnlpg.ID AS ID, ehr_zlnlpg.GRID AS GRID, ehr_zlnlpg.TJID AS TJID, ehr_grjbxx.Name AS 姓名, ehr_grjbxx.Sex AS 性别, ehr_grjbxx.Cardnum AS 身份证号, ehr_zlnlpg.SCORESUM AS 总…

代码随想录 贪心算法-中等题目-序列问题

376.摆动序列 376. 摆动序列 中等 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7…

ELEVENLABS AI在线AI语音合成工具,28种语言

一、Elevenlabs简介 ElevenLabs 可以使用合成语音、克隆语音或全新的「人工」语音将文本转化为语音&#xff0c;并且这些语音可以模仿不同性别、年龄和种族的声音。 ElevenLabs基于目前强大的生成式语音模型&#xff0c;提供文本生成语音、语音合成、语音克隆和语音识别分类功…

【好玩的游戏项目】在Linux系统下部署star-battle太空飞船射击小游戏

【好玩的开源项目】在Linux系统下部署 star-battle太空飞船射击小游戏 一、star-battle小游戏介绍1.1 star-battle小游戏简介1.2 star-battle小游戏玩法1.3 开源地址 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍2.3 Apache HTTP Server简介 三、安装httpd软件3.1 检查yu…

面试官:说说你对事件循环的理解

一、事件循环是什么 首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所有的任务都可以分为 同步任务&#…

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

一、面试官心理分析 其实这是很常见的一个问题&#xff0c;这俩问题基本可以连起来问。既然是消费消息&#xff0c;那肯定要考会不会重复消费&#xff1f;能不能避免重复消费&#xff1f;或者重复消费了也别造成系统异常可以吗&#xff1f;这个是 MQ领域的基本问题&#xff0c;…

还不知道快速原型设计?别担心,我们来解释给你听!

从一个想法到产品的实施是一个混乱的过程&#xff0c;毫无疑问&#xff0c;我们需要努力建立这个想法。但“光明”的想法是好是坏呢&#xff1f;幸运的是&#xff0c;我们有一个工具可以做到这一点——原型。原型是最终产品的模拟或样本版本&#xff0c;可用于发布前与用户反复…

部署私有KMS服务器,并设置自动激活Windows和office

介绍 vlmcsd是一个KMS激活服务器的模拟器&#xff0c;可以在Windows Server之外的平台上部署自己的KMS服务器。它是一个开源项目&#xff0c;由Wind4开发&#xff0c;目前在Linux上运行&#xff08;包括Android、FreeBSD、Solaris、Minix、Mac OS、iOS和Windows等&#xff09;…

【pycharm使用ssh连接服务器】

2、pycharm使用ssh连接服务器 1、具体流程2、一些需要注意的小问题2.1 更改代码地址2.2 本地代码上传到服务器2.3 在服务器的环境中上新安装库&#xff0c;但是pycharm检测不到 1、具体流程 打开pycharm – File – Setting 输入服务器的IP地址&#xff0c;端口号、登录账号名…

Linux中三次握手,四次挥手状态图,端口复用 半关闭状态,心跳包

tcp三次握手和四次挥手状态图&#xff1a; 为什么需要2MSL&#xff1a; 原因1&#xff1a;让四次挥手过程更加可靠&#xff0c;确保最后一个发送给对方的ACK到达&#xff1b;若对方没有收到ACK应答&#xff0c;对方会再次发送FIN请求关闭&#xff0c;此时在2MSL时间内被动关闭…

盛元广通粮油质量检测实验室管理系统

近年来对于食品安全问题层出不穷&#xff0c;为提高粮食检测中心管理水平&#xff0c;关系到千千万万的消费者的健康饮食问题&#xff0c;粮油作为老百姓日常生活饮食必需品、消耗品&#xff0c;需从源头上对粮食在本省&#xff08;区、市、县&#xff09;不同粮食品种检测检测…

Intel@cpu产品参数和命名@单核睿频和全核睿频

文章目录 选择合适的cpuintel cpu型号和命名小结 cpu排行时钟速度睿频单核睿频和全核睿频网络上流传的方法 在线查询 产品比较跑分比较 选择合适的cpu 如何选择游戏 CPU - 英特尔 (intel.cn)在决定购买具体的产品之前,建议广泛地查阅用户对它的评价以及是否有哪些因素是不满足…

7个学习自动化测试小技巧希望能帮助到你

一、编程语言 当我开始担任手动测试人员时&#xff0c;我不喜欢编码。但是&#xff0c;当我逐渐进入自动化领域时&#xff0c;对我来说很清楚&#xff0c;如果没有对编程语言的一些基本了解&#xff0c;就无法编写逻辑自动化测试脚本。 对编程有一点了解&#xff0c;不仅可以…