news 2026/3/25 18:29:18

mitt 通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mitt 通信

mitt 简介

在 Vue 应用中,我们经常遇到这样的情况:两个组件之间没有直接的父子关系,但需要共享数据或者互相通信。比如,一个页面中的头部组件需要知道用户点击了侧边栏的某个菜单项。这时候,使用 props 和事件会非常麻烦,因为需要经过多层组件的传递。mitt 就是为了解决这种问题而存在的。

mitt 是一个小巧的 JavaScript 事件发射器库,它只有 200 字节左右,但功能非常强大。它允许我们在任意组件之间建立通信,无论这些组件在组件树中的位置如何。你可以把 mitt 想象成一个"事件广播系统",任何组件都可以在这个系统上发送消息,也可以监听其他组件发送的消息。

mitt 的优势

mitt:非常轻量,API 简洁,专门为现代 JavaScript 设计,是 Vue 3 社区中最流行的事件总线方案。

它的 API 只有三个方法:on(监听事件)、emit(触发事件)、off(取消监听),学习成本很低。

使用教程


安装 mitt

打开终端,在项目根目录下运行:

npm i mitt
建立文件

为了让整个应用都能使用同一个事件总线,我们通常会在一个单独的文件中创建 mitt 实例,然后导出这个实例供其他模块使用。

在项目的 utils 文件夹中(如果没有就创建一个),新建一个名为 emitter.ts 的文件:

// utils/emitter.ts // 导入 mitt import mitt from 'mitt' // 创建一个 mitt 实例 // 这个实例就是我们的事件总线,所有组件都通过它与其它组件通信 const emitter = mitt() // 导出这个实例 export default emitter

这个文件的作用是创建一个全局的事件总线实例。我们在整个应用中都会使用这个实例,这样所有组件才能在同一个"广播系统"中通信。

mitt 的基本 API

在开始使用之前,我们先了解一下 mitt 的三个核心方法:

emitter.on(eventName, callback):监听事件。当名为 eventName 的事件被触发时,callback 函数会被调用。

emitter.emit(eventName, data):触发事件。触发名为 eventName 的事件,并将 data 数据传递给所有监听该事件的回调函数。

emitter.off(eventName, callback):取消监听事件。移除对 eventName 事件的监听。如果不传递 callback 参数,则会移除该事件的所有监听函数。

实例

假设我们有两个兄弟组件:哥哥组件和弟弟组件。哥哥想要给弟弟传递一个数据。

首先,我们分析一下通信流程:

接收数据的组件(弟弟):需要提前监听事件,准备好接收数据。

发送数据的组件(哥哥):在合适的时候触发事件,并传递数据。

首先,在弟弟组件中监听事件:

<!-- BrotherYounger.vue --> <template> <div class="younger"> <h3>弟弟组件</h3> <p>从哥哥那里接收到的数据:{{ receivedData }}</p> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue' // 导入事件总线实例 import emitter from '@/utils/emitter' const receivedData = ref('') // 组件挂载后开始监听事件 onMounted(() => { // 监听名为'sendA'的事件 // 当这个事件被触发时,回调函数会被调用,参数value就是传递过来的数据 emitter.on('sendA', (value) => { receivedData.value = value console.log('弟弟收到了数据:', value) }) }) // 组件卸载前取消事件监听 onUnmounted(() => { emitter.off('sendA') }) </script>

在弟弟组件中,我们做了以下几件事:

1. 导入事件总线实例 emitter。

2. 在 onMounted 生命周期钩子中,使用 emitter.on 监听名为 'sendA' 的事件。当这个事件被触发时,回调函数会被调用,参数 value 就是哥哥组件传递过来的数据。

3. 在 onUnmounted 生命周期钩子中,使用 emitter.off 取消对 'sendA' 事件的监听。这一步非常重要,可以避免内存泄漏。

然后,在哥哥组件中触发事件:

<!-- BrotherElder.vue --> <template> <div class="elder"> <h3>哥哥组件</h3> <button @click="sendDataToYounger">给弟弟发送数据</button> </div> </template> <script setup> // 导入事件总线实例 import emitter from '@/utils/emitter' const sendDataToYounger = () => { const data = '这是哥哥发送的数据A' // 触发名为'sendA'的事件,并传递数据 emitter.emit('sendA', data) console.log('哥哥发送了数据:', data) } </script>

在哥哥组件中,我们做了以下几件事:

1. 导入事件总线实例 emitter。

2. 定义一个方法 sendDataToYounger,当按钮被点击时调用这个方法。

3. 在方法中,使用 emitter.emit 触发名为 'sendA' 的事件,并传递数据。

现在,当用户点击哥哥组件中的按钮时,'sendA' 事件会被触发。弟弟组件监听到这个事件,就会执行回调函数,将接收到的数据赋值给 receivedData 变量,这样模板中就会显示这个数据。

重要注意事项:及时解绑事件
使用 mitt 时,有一个非常重要的注意事项:一定要在组件卸载时解绑事件。如果不解绑,即使组件已经被销毁,它的事件监听函数仍然存在于事件总线中。这会导致两个问题:

1. 内存泄漏:监听函数一直存在,无法被垃圾回收器回收。

2. 错误调用:当事件再次被触发时,会调用到已经不存在的组件的函数,可能导致错误。

因此,我们一定要在 onUnmounted 生命周期钩子中解绑事件。如果组件监听了多个事件,可以分别解绑:

onUnmounted(() => { emitter.off('sendA') emitter.off('sendB') // ... 解绑所有监听的事件 })

参考文章:https://blog.csdn.net/2301_80216352/article/details/155522600

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 13:10:27

手把手搞电子凸轮:200smart+威纶通玩转相对运动

MoveRelative&#xff08;相对运动指令-电子凸轮&#xff09; 1.西门子200smart 2.威纶通触摸屏 3.pls指令编写&#xff0c;带加减速&#xff0c;梯形加减速。 可正向运动和反向运动。 4.带减速停止。 5.暂不支持超驰功能。 最近在车间折腾电子凸轮控制&#xff0c;用西门子200…

作者头像 李华
网站建设 2026/3/12 23:10:42

2026年天府软件园产业生态协同创新大会成功举办

2026年1月29日&#xff0c;“立园聚企满园兴产——2026年天府软件园产业生态协同创新大会暨企业家交流会”成功举办。此次大会得到了成都市经济与信息化局和成都高新区数字经济局的指导&#xff0c;由国家数字服务出口基地&#xff08;成都&#xff09;及天府软件园主办&#x…

作者头像 李华
网站建设 2026/3/17 17:31:09

MATLAB电力电子建模仿真:双闭环功率因数校正(PFC)

matlab电力电子建模仿真—双闭环功率因数校正&#xff08;PFC&#xff09;建模仿真 双闭环PFC这玩意儿在电源设计里简直就是基本功&#xff0c;搞电力电子的老铁们肯定不陌生。今天咱们用Matlab/Simulink撸个模型&#xff0c;直接上干货不整虚的。先剧透个重点&#xff1a;电压…

作者头像 李华
网站建设 2026/3/19 6:39:31

人才办数字化转型:如何搭建区域一体化招聘平台服务中小企业?

博主介绍&#xff1a; 所有项目都配有从入门到精通的安装教程&#xff0c;可二开&#xff0c;提供核心代码讲解&#xff0c;项目指导。 项目配有对应开发文档、解析等 项目都录了发布和功能操作演示视频&#xff1b; 项目的界面和功能都可以定制&#xff0c;包安装运行&#xf…

作者头像 李华
网站建设 2026/3/20 2:14:06

Oracle19c ADG搭建

一、环境配置 1、主机环境 类型主机名IP主库p19c192.168.229.150备库p19cstd192.168.229.151 这里选择做两个19c单机环境 tip&#xff1a;数据库服务名与主机名一致 19c的安装可以参考以下教程&#xff0c;教程是以p19c为例&#xff0c;在安装p19cstd时&#xff0c;需要将…

作者头像 李华
网站建设 2026/3/18 21:59:37

Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解

一、最强大的搜索命令&#xff1a;find 首先进行一点说明&#xff0c;find命令是我们在Linux系统中用来进行文件搜索用的最多的命令&#xff0c;功能特别强大。但是我们要说的是尽量少用find命令去执行搜索任务&#xff0c;就算要搜索我们也应该尽量的缩小范围&#xff0c;也不…

作者头像 李华