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

Vue组件通信-mitt

全局任意组件通信

对于非嵌套关系的组件(兄弟组件、跨越很远的组件),除了 Pinia 这种全局状态管理库外,我们也可以使用Mitt实现事件总线。

使用mitt

第一步:安装

npm install mitt

安装完成之后一般会自动给你创建一个文件夹叫utils,一个文件emitter.ts的文件

第一步:演示用法

  • 绑定事件
emitter.on('test', () => { console.log('test被调用了'); }) emitter.on('itshare', () => { console.log('itshare被调用了'); })
  • 触发事件
setInterval(() => { emitter.emit('test'), emitter.emit('itshare') }, 1000);

注意要在main.ts临时引入一下哈

  • 解绑事件
setTimeout(() => { emitter.off('test') }, 3000);

也可以解绑所有事件

setTimeout(() => { emitter.all.clear() }, 3000);

实际使用

  • 比如我现在又两个兄弟组件,都有自己的数据
//子组件1哥哥 let toy1 = ref('奥特曼'); //子组件2弟弟 let toy2 = ref('芭比娃娃');
  • 现在我想将芭比娃娃这个玩具给哥哥玩一下,所以我肯定要在哥哥身上绑定事件
emitter.on('getToy',() => { })
  • 这个可以传一个值进去,这个值有弟弟传进来,因为是弟弟给哥哥玩具
<script setup lang="ts"> import { ref } from 'vue'; import emitter from '@/utils/emitter'; let toy = ref('') let toy1 = ref('奥特曼'); emitter.on('getToy', (value: any) => { toy.value = value; }) </script> <h4>弟弟给的玩具:{{ toy }}</h4>
  • 然后弟弟就要去触发这个事件
<template> <div class="box"> <h3>子组件2</h3> <h4>玩具:{{ toy2 }}</h4> <button @click="emitter.emit('getToy', toy2)">把玩具给哥哥</button> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import emitter from '@/utils/emitter'; let toy2 = ref('芭比娃娃'); </script>

getToy就是绑定的事件,这个toy2就是第二个参数,传给哥哥的value

这种传递是全局的,不管是全局组件还是父子组件都可以传递,不管你嵌套了多少层都可以传递

注意事项

<script setup lang="ts"> import { ref, onUnmounted } from 'vue'; import emitter from '@/utils/emitter'; let toy = ref('') let toy1 = ref('奥特曼'); emitter.on('getToy', (value: any) => { toy.value = value; }) //在组件卸载前解绑事件 onUnmounted(() => { emitter.off('getToy') }) </script>

你最好在组件挂载前解绑事件,原因是想mitt这样的作法就是事件总线,它是一个全局对象,如果组件销毁了,这个回调仍然会被引用,这样这个组件被占用的内存无法被垃圾回收,可能会导致内存泄漏,性能下降等;

http://www.jsqmd.com/news/464492/

相关文章:

  • WebRTC实战:如何用RTCPeerConnection和RTCDataChannel搭建实时聊天应用(附完整代码)
  • 【图像加密】基于Halton 序列进行图像加密 有位置扰乱和像素扰乱附Matlab代码
  • PLCopen运动控制避坑指南:单轴功能块MC_Stop/MC_Power的7个典型误用场景
  • KVM虚拟化性能优化全攻略:在Ubuntu服务器上榨干你的硬件资源
  • 手把手教你用HC-05蓝牙模块实现无线串口通信(含AT指令大全)
  • Ubuntu 云服务部署 OpenClaw 并接入飞书机器人
  • GraphRAG与LightRAG实战对比:医疗与法律场景下的RAG技术选型指南
  • 机器人运动控制:四元数 vs 旋转矩阵,谁才是SLAM算法的最佳选择?
  • Spring Boot中CXF服务列表隐藏与WSDL安全配置实战(附Nginx IP限制)
  • 开发智能面经爬取系统:技术选型、架构设计与踩坑记录
  • 麒麟V10系统下ffmpeg完整安装指南:从依赖包到环境变量配置
  • ANSYS Fluent浮点错误排查指南:从网格优化到求解器调参的5个实战技巧
  • Python 库使用全攻略(新手友好 + 实战导向)
  • x64dbg消息断点避坑指南:为什么你的WM_COMMAND断点总失效?
  • 1688 商品采集 API 避坑大全:常见错误及解决方案
  • CANoe实战技巧:用DBC文件实现车速信号从ESP到Display的完整通信链路
  • Axure RP 9汉化版 vs 英文原版:功能对比与使用体验分享
  • 4diac Forte运行时源码解析:从事件链调度到工业级应用优化
  • Excel数据转GIS神器:ArcGIS Pro批量处理SHP文件技巧大公开
  • LM2596动态调压新玩法:用单片机PWM实现0-9.9V无级调节(含滤波电路设计)
  • 用CryptoMiniSat处理CNF文件实战:从DIMACS格式解析到SAT问题求解
  • 220V通断检测电路设计避坑指南:从光耦选型到PCB布局实战
  • Android 12系统开发者的SELinux生存手册:以RK3588自启动服务为例
  • Halcon局部变形匹配避坑指南:检测橡胶件毛刺时如何避免误判?
  • 大模型本地推理环境配置全攻略:从CUDA安装到bitsandbytes报错解决
  • Cheat Engine修改器检测避坑指南:从原理到实战,FairGuard方案全解析
  • 传感器融合入门:激光雷达和相机坐标系转换的常见误区与避坑指南
  • 高阶行列式不再难:手把手教你用按行展开法则简化计算
  • Remix-IDE本地开发环境搭建全攻略:从安装到文档配置
  • Runway 推出可定制实时数字人,支持企业知识库;钉钉发布 DingTalk A1 医生版丨日报