当前位置:   article > 正文

eventbus封装

eventbus封装

本文的代码仅针对vue使用

一、eventbus介绍

 eventbus就是数据总线,全局通信的一种方案。 很多语言都有这个东西。

二、基本使用

1.普通版

  1. import Vue from 'vue'
  2. export default new Vue()

2.二次封装一下

  1. import Vue from 'vue';
  2. class EventBus {
  3. constructor() {
  4. this.bus = new Vue();
  5. this.events = new Set();
  6. }
  7. $on(eventName, callback) {
  8. // 如果同名事件已存在,则卸载上一个同名称事件
  9. if (this.events.has(eventName)) {
  10. this.$off(eventName);
  11. }
  12. setTimeout(() => {
  13. this.events.add(eventName)
  14. this.bus.$on(eventName, callback);
  15. }, 0)
  16. }
  17. $emit(eventName, ...args) {
  18. this.bus.$emit(eventName, ...args);
  19. }
  20. $off(eventName) {
  21. if (this.events.has(eventName)) {
  22. this.events.delete(eventName)
  23. }
  24. this.bus.$off(eventName);
  25. }
  26. }
  27. export default new EventBus();

settimeout 是重点, 放到异步队列去订阅,有效避免重复发布订阅不到的问题。

三、使用

1.先引入

import eventBus from "@/utils/eventBus";

2.发布

  1. eventBus.$on('eventName', (value) => {
  2. console.log(value)
  3. })

3.订阅 

eventBus.$emit('eventName', {})

4.卸载

eventBus.$off('eventName')

 5.关键

  1. 在组件A我们发布了一个事件, 组件A卸载的时候我们要手动把发布的事件一起卸载了。
  2. 事件名是个字符串,不要起重复的名字,这玩意没命名空间,会覆盖。
  3. vue2用用就得了,有vuex都不要用这个。vue3更没必要用,有pinia,体积又不大,用起来还很香。

总结

我的看法是这个东西看似好像很好用,随便哪里都能通信,代码写的还不多,好理解。 实际除非你的项目很小,需要全局维护的地方不多,用这个图个快捷方便。使用问题还是多多,重复发布相同名称的事件就有bug了,发布了不卸载,就内存泄露了。项目中用的多了,就难以维护了。

吐槽:我目前面对的问题是,接手了一个项目,总是会内存溢出。我就去通过开发者工具去排查,发现这个内存总是下不来。先检查一波定时器之类的,又检查了一遍一些包,有没有在指定时机卸载,发现一些点,修正后,还是存在明显的内存泄露问题。很严重,长时间操作浏览器会内存不足崩溃那种。这个时候我发现项目中使用了eventbus。全局一搜索,500多处使用,后面我利用我二次封装的代码,在$on里打印仅仅刚进入应用就将近发布了二十几个。 我的内心是崩溃的,让我一个个去追踪,我是拒绝的。只能想办法根源处处理一下,所以我二次封装了一下。这波是前人乘凉,后人栽树。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/318578
推荐阅读
相关标签
  

闽ICP备14008679号