当前位置: 首页 > news >正文

Vue3中的常见组件通信之mitt

Vue3中的常见组件通信之mitt

概述

​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refsparent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。

组件关系传递方式
父传子1. props
2. v-model
3. $refs
4. 默认插槽、具名插槽
子传父1. props
2. 自定义事件
3. v-model
4. $parent
5. 作用域插槽
祖传孙、孙传祖1. $attrs
2. provide、inject
兄弟间、任意组件间1. mitt
2. pinia

​ props和自定义事件详见本人另一篇文章:
Vue3中的常见组件通信之props和自定义事件
下面接着上文来继续记录mitt的用法。

3.mitt

mitt与pubsub订阅消息与发布消息功能类似,它可以实现在任意组件间的通信。

3.1安装mitt及引入mitt

mitt需要安装,在终端中输入命令npm i mitt来安装。

mitt安装好之后按照工程化的管理需要在src的文件下新建文件夹utils,然后在utils文件夹中新建文件emitter.ts。

在emitter.ts文件中引入mitt,并创建emitter,同时暴露emitter,如下代码:

//引入mitt
import mitt from 'mitt'//调用mitt,得到emitter,emitter可以绑定事件和触发事件
const emitter = mitt()//暴露emitter
export default emitter

之后需要再在main.ts中引入emitter,如下代码:

import emitter from '@/utils/emitter'

3.2 emitter基本用法

emitter身上有四个方法,分别是

  • **on()😗*用来绑定事件,接收两个参数,第一个参数是事件名,第二个参数是事件触发时的回调函数;
  • **emit()😗*用来触发事件,参数为事件名;
  • **off()😗*用来解绑事件,参数为事件名;
  • **all:**all有clear属性,直接调用clear()属性可以解绑全部事件。

以下代码为展示emitter的基本用法:

//绑定事件test1,当事件触发时执行回调
emitter.on('test1',()=>{console.log('test1被调用了')
})//绑定事件test2,当事件触发时执行回调
emitter.on('test2',()=>{console.log('test2被调用了')
})//绑定事件test3,当事件触发时执行回调
emitter.on('test3',()=>{console.log('test3被调用了')
})//触发事件,每间隔1秒触发一次
setInterval(()=>{//触发事件test1emitter.emit('test1')//触发事件test2emitter.emit('test2')//触发事件test3emitter.emit('test3')
},1000)//解绑事件,2秒后解绑test1
setTimeout(()=>{emitter.off('test1')console.log('--------test1解绑了')
},2000)//解绑事件,4秒后解绑所有事件
setTimeout(()=>{emitter.all.clear()console.log('--------所有的事件解绑了')
},4000)

运行后在控制台输出如下内容:

image-20240602215320240

3.3emitter在组件中的用法

首先创建一个父组件,两个子组件,父组件代码如下:

<template><div class="father"><h3>父组件</h3><Child1/><Child2/></div>
</template><script setup lang="ts" name="Father">import Child1 from './Child1.vue'import Child2 from './Child2.vue'
</script><style scoped>.father{margin: 5px;background-color:rgb(79, 186, 111);padding: 20px;color: white;}
</style>

子组件1代码:

<template><div class="child1"><h3>子组件1</h3></div>
</template><script setup lang="ts" name="Child1"></script><style scoped>.child1{margin: 5px;background-color: rgba(7, 7, 7, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #760e0e;}	
</style>

子组件2代码:

<template><div class="child2"><h3>子组件2</h3></div>
</template><script setup lang="ts" name="Child2"></script><style scoped>.child2{margin: 5px;background-color: rgba(255, 255, 255, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #05035f;}	
</style>

运行效果如下:

image-20240602221333262

然后我们在子组件1中准备一些数据如下:

//数据
let book = reactive({name:'西游记',author:'吴承恩',price:119.95
})

然后在页面中展示:

<!-- 展示 -->
<h4>图书名称:{{ book.name }}</h4>
<h4>图书作者:{{ book.author }}</h4>
<h4>图书价格:¥{{ book.price }}</h4>

运行效果如下:

image-20240603204353377

接下来在子组件2中引入emitter,然后创建book数据,给emitter绑定事件,并传入回调函数:

//引入emitterimport emitter from '@/utils/emitter';import { reactive } from 'vue';//数据let book = reactive({name:'',author:'',price:null})//给emitter绑定getBook事件,传入回调函数,回调函数接收一个参数emitter.on('getBook',(value:any)=>{// console.log(value)book.name = value.namebook.author = value.authorbook.price = value.price})

然后在子组件1中创建一个按钮,绑定click事件,触发getBook事件,并传递book参数:

<button @click="emitter.emit('getBook',book)">将book信息发送给子组件2</button>

最后在子组件2中展示接收的到的信息:

	<!-- 展示 --><h4>图书名称:{{ book.name }}</h4><h4>图书作者:{{ book.author }}</h4><h4>图书价格:¥{{ book.price }}</h4>

最后运行后页面效果如下:

image-20240603205650064

点击按钮后效果如下:

image-20240603205727565

至此已经完成了子组件1向子组件2通信。

子组件1完整代码如下:

<template><div class="child1"><h3>子组件1</h3><!-- 展示 --><h4>图书名称:{{ book.name }}</h4><h4>图书作者:{{ book.author }}</h4><h4>图书价格:¥{{ book.price }}</h4><button @click="emitter.emit('getBook',book)">将book信息发送给子组件2</button></div>
</template><script setup lang="ts" name="Child1">import emitter from '@/utils/emitter';import { reactive } from 'vue';//数据let book = reactive({name:'西游记',author:'吴承恩',price:119.95})
</script><style scoped>.child1{margin: 5px;background-color: rgba(7, 7, 7, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #760e0e;}	
</style>

子组件2 的完整代码如下:

<template><div class="child2"><h3>子组件2</h3><!-- 展示 --><h4>图书名称:{{ book.name }}</h4><h4>图书作者:{{ book.author }}</h4><h4>图书价格:¥{{ book.price }}</h4></div>
</template><script setup lang="ts" name="Child2">//引入emitterimport emitter from '@/utils/emitter';import { reactive } from 'vue';//数据let book = reactive({name:'',author:'',price:null})//给emitter绑定getBook事件,传入回调函数,回调函数接收一个参数emitter.on('getBook',(value:any)=>{// console.log(value)book.name = value.namebook.author = value.authorbook.price = value.price})
</script><style scoped>.child2{margin: 5px;background-color: rgba(255, 255, 255, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #05035f;}	
</style>

3.4 小结

接收数据的组件必须要先绑定事件(订阅),发送数据的组件要触发事件,只要组件中引入了emitter,并执行了emitter.emit()代码并传递参数,即可实现任意组件间的通信。

相关文章:

Vue3中的常见组件通信之mitt

Vue3中的常见组件通信之mitt 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs…...

MySQL快速入门(极简)

SQL 介绍及 MySQL 安装 一、实验简介 本课程为实验楼提供的 MySQL 实验教程&#xff0c;所有的步骤都在实验楼在线实验环境中完成&#xff0c;学习中请按照实验步骤依次操作。 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多…...

CentOS7安装NVIDIA显卡驱动指引【笔记】

CentOS7安装NVIDIA显卡驱动指引【笔记】 实践设备:华硕FX-PRO(NVIDIA GeForce GTX 960M) 环境准备: 1、将系统安装到设备上正常运行; 2、设备网络调试,可以正常访问外网; 3、配置ssh服务(非必要,根据实际情况)。 说明: 本文档所提供的指引和参考主要基于特定实践…...

【RabbitMQ】RabbitMQ配置与交换机学习

【RabbitMQ】RabbitMQ配置与交换机学习 文章目录 【RabbitMQ】RabbitMQ配置与交换机学习简介安装和部署1. 安装RabbitMQ2.创建virtual-host3. 添加依赖4.修改配置文件 WorkQueues模型1.编写消息发送测试类2.编写消息接收&#xff08;监听&#xff09;类3. 实现能者多劳 交换机F…...

常见排序算法,快排,希尔,归并,堆排

后面的排序中都要用到的函数 //交换 void Swap(int* p1, int* p2) {int* tmp *p1;*p1 *p2;*p2 tmp; } 包含的头文件 "Sort.h" #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<time.h> #include<s…...

语法的时态1——一般现在时(1)

定义&#xff1a;一般现在时用来表示经常发生的动作&#xff0c;以及客观事实。 一般现在时的构成以及标志词 1.一般现在时的结构 &#xff08;1&#xff09;主系表结构 构成&#xff1a;主语be(am,is,ear)其他。属于状态句。 I…...

JAVA:在IDEA引入本地jar包的方法并解决打包scope为system时发布无法打包进lib的方案

一.引入本地Jar包的步骤 有时maven依耐的包是本地的jar包&#xff0c;此时需要进行以下步骤设置。 步骤1.在pom.xml中添加插件设置,将system范围包含进来&#xff0c;此设置是为了在打包时&#xff0c;本地jar包自动生成到部署包里。(若无法打进包&#xff0c;请参考下文的方…...

Hadoop3:MapReduce源码解读之Map阶段的CombineFileInputFormat切片机制(4)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 6、CombineFileInputFormat原理解析 类的继承关系 与TextInputFormat切片机制的区别 框架默认的TextI…...

GPT-4o:OpenAI的最新篇章与深度探索

引言&#xff1a; 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术持续引领着技术创新的步伐。自2023年引入以来&#xff0c;GPT系列模型一直以其卓越的语言生成能力而闻名&#xff0c;近期的迭代——GPT-4o&#xff0c;更是为这一领域的研究和应用带…...

OpenGauss数据库-5.数据更新

第1关&#xff1a;插入数据 gsql -d postgres -U gaussdb -W "passwd123123" create table student (id integer primary key,name char(20),age integer ); insert into student values(1,"lily",20),(2,lily,21),(3,marry,19); 第2关&#xff1a;删除数…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机场航班调度程序(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 🌍 评测功能需要订阅专栏后私信联系清隆解锁~ 文章目录 …...

Spark作业运行异常慢的问题定位和分析思路

一直很慢 &#x1f422; 运行中状态、卡住了&#xff0c;可以从以下两种方式入手&#xff1a; 如果 Spark UI 上&#xff0c;有正在运行的 Job/Stage/Task&#xff0c;看 Executor 相关信息就好。&#x1f4bb; 第一步&#xff0c;如果发现卡住了&#xff0c;直接找到对应的…...

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…...

Python基础教程(九):Lambda 函数

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

docker从入门到精通

一、Docker基本命令 1. Docker的常用命令 帮助命令 docker version # docker版本信息 docker info # 系统级别的信息&#xff0c;包括镜像和容器的数量 docker 命令 --help 帮助文档 镜像命令 docker images 查看所有本地主机上的镜像 [rootiZ2zeg4ytp0whqtmxbsqiiZ…...

介绍工厂模式

简单工程 public class SingleFactoryTest {public static void main(String[] args) {SingleFactory factory new SingleFactory();Product productA factory.getObject("1");productA.method();Product productB factory.getObject("2");productB.me…...

大数据领域的workload是什么意思?

什么是workload&#xff1f; 在大数据领域&#xff0c;"workload"指的是需要处理的数据集和对其执行的操作的组合。它描述了大数据系统需要执行的任务的类型和规模。 我们可以从以下几个维度来理解大数据领域的 workload&#xff1a; 数据的特征: 数据量 需要处…...

引入别人的安卓项目报错

buildscript { repositories { google() jcenter() } dependencies { classpath com.android.tools.build:gradle:4.1.0 // 使用最新版本的插件 } } allprojects { repositories { google() jcenter() } } 在…...

Python Excel 指定内容修改

需求描述 在处理Excel 自动化时,财务部门经常有一个繁琐的场景,需要读取分发的Excel文件内容复制到汇总Excel文件对应的单元格内,如下图所示: 这种需求可以延申为,财务同事制作一个模板,将模板发送给各员工,财务同事需收取邮件将员工填写的excel文件下载到本机,再类似…...

【力扣高频题】003.无重复字符的最长子串

前段时间和小米的某面试官聊天。因为我一直在做 算法文章 的更新&#xff0c;就多聊了几句算法方面的知识。 并且在聊天过程中获得了一个“重要情报”&#xff1a;只要他来面试&#xff0c;基本上每次的算法题&#xff0c;都会去考察关于 子串和子序列 的问题。 的确&#xf…...

别再默认用E1000了!VMware虚拟机网卡选VMXNET3还是E1000E?实测数据告诉你答案

VMware虚拟机网卡性能实战&#xff1a;从理论到选型决策树 在虚拟化环境中&#xff0c;网络性能往往是决定整体系统效率的关键瓶颈之一。作为一名长期奋战在VMware运维一线的技术专家&#xff0c;我见过太多因为网卡选型不当导致的性能问题——从莫名其妙的网络延迟到令人抓狂的…...

VSCode + Cline + Codeium + OpenSpec + DeepSeek 完整配置指南

VSCode Cline Codeium OpenSpec DeepSeek 完整配置指南 &#x1f4cb; 最终方案概述 组件用途费用VSCode代码编辑器免费Codeium (Windsurf)Tab 补全 生成注释免费ClineAI Agent&#xff08;复杂任务、多文件操作&#xff09;免费OpenSpec规范驱动开发&#xff08;复杂功…...

保姆级排错:Keil里J-Link选项神秘消失?手把手教你定位GD32E23等ARM-M23内核芯片的调试器兼容问题

当Keil调试器选项消失时&#xff1a;深度解析ARM-M23内核芯片的调试兼容性问题 第一次在Keil的Debug配置界面发现J-Link选项神秘消失时&#xff0c;我盯着屏幕愣了几秒钟——前一天明明还能正常使用的工具链&#xff0c;怎么突然就"罢工"了&#xff1f;这种看似"…...

重温DIRE:走向通用人工智能生成的图像检测

1.摘要生成模型的快速发展提高了图像质量&#xff0c;并使图像合成广泛可用&#xff0c;引起了对内容可信度的关注。为了解决这个问题&#xff0c;我们提出了一种称为通用重建残差分析(UR2EA)的方法来检测合成图像。我们的研究表明&#xff0c;当通过预训练的扩散模型重建GAN和…...

Shinkai Node:无代码AI智能体平台架构解析与实战部署

1. 项目概述&#xff1a;Shinkai Node&#xff0c;一个无需代码的AI智能体构建平台 最近在折腾AI智能体&#xff08;AI Agent&#xff09;的时候&#xff0c;发现了一个挺有意思的开源项目—— Shinkai Node 。它来自dcSpark团队&#xff0c;核心目标非常明确&#xff1a; …...

Watercolor风格在MJ中被严重低估的3个底层能力:纸基模拟、颜料扩散建模、干湿叠加逻辑(Adobe资深插画师联合验证)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Watercolor风格在MJ中被严重低估的3个底层能力&#xff1a;纸基模拟、颜料扩散建模、干湿叠加逻辑&#xff08;Adobe资深插画师联合验证&#xff09; 纸基模拟&#xff1a;不只是纹理&#xff0c;而是…...

别再到处找激活码了!手把手教你用vlmcsd在Windows上自建KMS服务器(附各版本密钥)

企业级Windows批量激活解决方案&#xff1a;安全高效的本地KMS部署指南 在数字化办公环境中&#xff0c;批量激活Windows操作系统一直是IT管理员面临的常见挑战。传统单机激活方式效率低下&#xff0c;而依赖外部KMS服务器又存在连接不稳定、隐私泄露等潜在风险。本文将深入探讨…...

从零到一:手把手教你搭建MinGW-w64开发环境

1. 为什么需要MinGW-w64开发环境 第一次在Windows上写C代码时&#xff0c;我踩了个大坑&#xff1a;好不容易写完的代码&#xff0c;发现根本没法编译运行。这才意识到Windows不像Linux自带GCC编译器&#xff0c;需要额外搭建开发环境。MinGW-w64就是解决这个问题的神器&#x…...

3分钟快速解锁网易云音乐NCM格式:ncmdump音频解密工具完全指南

3分钟快速解锁网易云音乐NCM格式&#xff1a;ncmdump音频解密工具完全指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在特定客户端播放&#xff0c;无法在其他设…...

Notero:终极Zotero与Notion同步插件,简单快速实现文献管理一体化

Notero&#xff1a;终极Zotero与Notion同步插件&#xff0c;简单快速实现文献管理一体化 【免费下载链接】notero A Zotero plugin for syncing items and notes into Notion 项目地址: https://gitcode.com/gh_mirrors/no/notero 你是否正在为文献管理与笔记整理之间的…...