一文详解mitt和bus有什么区别

 更新时间:2026年03月04日 11:39:25   作者:李剑一  
事件总线作为一种全局的组件通信方法,符合订阅发布模式,由于其简单有效的使用方式,受到部分开发者的欢迎,这篇文章主要介绍了mitt和bus有什么区别的相关资料,需要的朋友可以参考下

前言

之前没太关注过组件之间的数据传递问题,一般做项目如果是Vue2.x版本,直接用Vuex

如果是Vue3.x版本,直接用Pinia。基本上很少用Bus(事件总线),也没太关注过其他方案。

问题

最近做一个不大不小的项目,本来想着直接用 Pinia 了,但是页面有点儿少,用 Pinia 感觉有点儿杀鸡用牛刀。

所以就选择用 props 传值的方式,但是兄弟组件的传值害惨我了。

遂看一下网上的方案,兄弟组件的传值大概有三种手段:

  1. 最传统的 Props 传值的方案。
  2. 简单粗暴的 Bus 事件总线方案。
  3. 封装好的库 Mitt 传参方案。

Props方案

最为传统的传参方案,父子组件之间传参非常好用。封装组件也是相当哇塞,但是在兄弟组件之间传参太过复杂。

尤其是从 A 组件的子组件 A1 上,传递参数到 B 组件的子组件 B1 上。层层转发。

写起来太过麻烦,而且用起来也不方便,每改一个参数需要四个组件同时修改。

Bus方案

我个人在团队内部不喜欢大家使用 Bus ,原因很简单,不易维护

定义的 Bus 如果在好几个地方使用很难得到有效的控制,出现问题也很难快速定位。

并且我发现好几个小兄弟在写 Bus 的时候都忘记使用 $off 移除监听了,很容易造成应用内存泄漏。

另外就是在开发过程中 VsCodeWebStorm 是不支持通过 ctrl + 点击 寻找对应方法的,开发体验也一般情况。

最最重要的是,在Vue3.x版本中已经正式移除了 Bus 的API。

Mitt方案

Mitt这个方案我目前在正式的项目中还没用过,只是简单在几个Demo中尝试用了用。

怎么说呢,非常简洁!

一共就三个方法:

import mitt from 'mitt'
const emitter = mitt();
// 发送事件
emitter.emit('custom-event', 'Hello from A')
// 接收事件
emitter.on('custom-event', handler)
// 移除事件
emitter.off('custom-event', handler)

能看得到的优点:小(200多kb)、无依赖、Ts友好,但是缺点也同样明显:

  • 创建的事件全局共享,可能存在事件名冲突。
  • 需要手动调用 off 移除监听。
  • 调试追踪困难
  • 异步问题

Mitt和Bus的区别

看Mitt的缺点和Bus的缺点几乎一致,那么他俩到底有区别嘛?

还是说尤老师看到现成的直接对这部分代码不重写了?😂

先说答案:Mitt和Bus是存在本质性区别的

原理不同

Mitt是一个独立的Js库,无任何相关依赖,在任何环境都可以使用。Vue、React、原生Js等都能用。

在Mitt的内部手动维护了一个事件的映射表Map<string, Function[]>

而Bus依赖于Vue2.x的内部API,其原理上是基于Vue的观察者模式

使用不同

虽然他们大部分的用法非常相似,比如说事件发送,一个用 $emit,一个用 emit()

但是也存在很多区别。

Bus 不支持通配符监听,而 mitt 可以通过 mitt.on('*', ()=>{}) 的方式实现通配符的监听。

并且 mitt 支持Ts,这是最关键的。毕竟现在绝大多数的新应用在开发的时候都要求使用Ts

总结

如果是老项目,我仍然推荐原来用啥就用啥。

如果是新项目,并且上了Vue3.x版本,那么你除了mitt恐怕没有别的选择(小项目)。Vue3.x 版本移除了 Bus

另外需要强调的是 mitt临时通信,也就是说它只是一个临时方案。如果你所在的是一个大项目,我劝你仍然稳妥的使用 Pinia

到此这篇关于mitt和bus有什么区别的文章就介绍到这了,更多相关mitt和bus区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现方法

    前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现方法

    token是一个用户信息的表示,在登录中将会从后端拿到token,然后用户才可以进行往后的一系列操作,这篇文章主要给大家介绍了关于前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现的相关资料,需要的朋友可以参考下
    2024-01-01
  • Element plus中el-input框回车触发页面刷新问题以及解决办法

    Element plus中el-input框回车触发页面刷新问题以及解决办法

    在el-form表单组件中el-input组件输入内容后按下Enter键刷新了整个页面,下面这篇文章主要给大家介绍了关于Element plus中el-input框回车触发页面刷新问题以及解决办法,需要的朋友可以参考下
    2024-03-03
  • vue3动态组件使用详解

    vue3动态组件使用详解

    这篇文章主要介绍了vue3动态组件使用详解的相关资料,需要的朋友可以参考下
    2023-02-02
  • 使用vue完成微信公众号网页小记(推荐)

    使用vue完成微信公众号网页小记(推荐)

    公司最近有一个H5页面的功能,比较简单的一个调查表功能,嵌套在我们微信公众号里面。这篇文章主要介绍了使用vue完成微信公众号网页小记,需要的朋友可以参考下
    2019-04-04
  • 关于vue表单提交防双/多击的例子

    关于vue表单提交防双/多击的例子

    今天小编就为大家分享一篇关于vue表单提交防双/多击的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue3循环设置ref并获取的解决方案

    vue3循环设置ref并获取的解决方案

    我们在平时做业务的时候,父子组件通信会经常用到ref,这篇文章主要给大家介绍了关于vue3循环设置ref并获取的解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • vue+elementUI封装一个根据后端变化的动态table(完整代码)

    vue+elementUI封装一个根据后端变化的动态table(完整代码)

    这篇文章主要介绍了vue+elementUI,封装一个根据后端变化的动态table,实现了自动生成和插槽两个方式,主要把el-table 和el-pagination封装在一起,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 关于Vue中echarts响应式页面变化resize()的用法介绍

    关于Vue中echarts响应式页面变化resize()的用法介绍

    Vue项目中开发数据大屏,使用echarts图表根据不同尺寸的屏幕进行适配,resize()可以调用echarts中内置的resize函数进行自适应缩放,本文将给大家详细介绍resize()的用法,需要的朋友可以参考下
    2023-06-06
  • Vue路由history模式解决404问题的几种方法

    Vue路由history模式解决404问题的几种方法

    这篇文章主要介绍了Vue路由history模式解决404问题的几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Vue鼠标点击事件和键盘事件举例详解

    Vue鼠标点击事件和键盘事件举例详解

    在Vue框架中我们经常需要绑定各种JS事件,如"点击事件"、"鼠标移动事件"、"键盘事件"等等,这篇文章主要给大家介绍了关于Vue鼠标点击事件和键盘事件的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论