一文详解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区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-router 学习快速入门

    vue-router 学习快速入门

    本篇文章主要介绍了vue-router 学习快速入门,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • vue+elementUI中el-radio设置默认值方式

    vue+elementUI中el-radio设置默认值方式

    这篇文章主要介绍了vue+elementUI中el-radio设置默认值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • vue组件通信的多种方法详解

    vue组件通信的多种方法详解

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • vue中组件如何使用vue-quill-editor

    vue中组件如何使用vue-quill-editor

    这篇文章主要介绍了vue中组件如何使用vue-quill-editor问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • vue中的封装常用工具类

    vue中的封装常用工具类

    这篇文章主要介绍了vue中的封装常用工具类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue Official 手动更改插件显示语言的解决方案

    Vue Official 手动更改插件显示语言的解决方案

    文章介绍如何通过修改Volar插件内部文件,使英文版VS Code显示中文代码提示,需手动调整language-server.js中的语言设置,但因文件经压缩混淆,操作复杂且无官方支持,存在兼容性风险
    2025-07-07
  • vuejs+element-ui+laravel5.4上传文件的示例代码

    vuejs+element-ui+laravel5.4上传文件的示例代码

    本篇文章主要介绍了vuejs+element-ui+laravel5.4上传文件的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • 深入浅析Vue不同场景下组件间的数据交流

    深入浅析Vue不同场景下组件间的数据交流

    探通过本篇文章给大家探讨不同场景下组件间的数据“交流”的Vue实现方法,感兴趣的朋友一起看看吧
    2017-08-08
  • Vue解决element-ui消息提示$message重叠问题

    Vue解决element-ui消息提示$message重叠问题

    这篇文章主要为大家介绍了Vue解决element-ui消息提示$message重叠问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vue3如何解决各场景loading过度(避免白屏尴尬!)

    vue3如何解决各场景loading过度(避免白屏尴尬!)

    在开发的过程中点击提交按钮,或者是一些其它场景总会遇到loading加载,下面这篇文章主要给大家介绍了关于vue3如何解决各场景loading过度的相关资料,避免白屏尴尬,需要的朋友可以参考下
    2023-03-03

最新评论