我们通常在使用非父子组件间通信时,采用new Bus()的方式来做一个事件广播。 但一个弊端就是,这种方式并不会自动销毁,所以为了避免回调函数重复执行,还要在destroyed周期中去做Bus.$off('event name', fn)的操作。

这样带来的冗余代码就是:

  1. $on 的回调函数必须是具名函数。不能简单的Bus.$on('event name', () => {})使用匿名函数作为回调了,所以需要将回调函数放到metheds中进行额外的声明
  2. 在destroyed生命周期中去销毁事件的监听。

因此轮子就被造出来,在非父子组件间通信时,解决重复绑定事件无法自动销毁的而导致回调函数被执行多次的问题。

import Vue from 'vue'// 存储所有的事件
const EventStore = {}
const Bus = new Vue()const destoryHandler = function() {// this 为调用此方法的vue组件const currentEventObj = EventStore[this._uid]if (!currentEventObj) {return}for (const type in currentEventObj) {const key = Array.isArray(type) ? type.join(',') : type// Bus 解绑事件Bus.$off(type, currentEventObj[key])}// 删除记录的事件集合delete EventStore[this._uid]
}const BusFactory = (vm) => {// 获取当前组件实例的destroyed生命周期const destroyed = vm.$options.destroyed// 获取当前组件实例的uidconst uid = vm._uidEventStore[uid] = {}!destroyed.includes(destoryHandler) && destroyed.push(destoryHandler)return {$on: (type, handler) => {const key = Array.isArray(type) ? type.join(',') : typeEventStore[uid][key] = handlerBus.$on(type, handler)},$off: (type, handler) => {if (!type) {delete EventStore[uid]Bus.$off()return}const key = Array.isArray(type) ? type.join(',') : type// 删除对应的事件delete EventStore[uid][key]Bus.$off(type, handler)},$once: (...params) => Bus.$once(...params),$emit: (...params) => Bus.$emit(...params)}
}// 这两行是允许bus不调用依然能够触发emit和once
BusFactory.$emit = (...params) => Bus.$emit(...params)
BusFactory.$once = (...params) => Bus.$once(...params)export default BusFactory

组件中使用:

import BusFactory from 'bus'
export default {data () {return {bus: BusFactory(this) // 使用BusFactory�将this绑定之后,返回一个 bus,即可无需关心销毁的问题了}},created () {// 在生命周期中进行 $onthis.bus.$on('event name', () => {// do  something})// 当使用 $once 与 $emit 可直接在BusFactory使用BusFactory.$once('event name', () => {// do  something})BusFactory.$emit('event name', '参数')}
}

参考Vue自动销毁的vue event Bus

vue自动销毁的eventBus相关推荐

  1. vue如何主动销毁子组件_Vue自动销毁的vue event Bus

    我们通常在使用非父子组件间通信时,采用new Bus()的方式来做一个事件广播. 但一个弊端就是,这种方式并不会自动销毁,所以为了避免回调函数重复执行,还要在destroyed周期中去做Bus.$of ...

  2. vue组件通信方式之eventBus

    我们在vue项目中最常遇到的问题就是组件之间的通信,父子通信,兄弟通信,跨组件之间的通信. 父子通信,通常父组件向子组件通过props传值,子组件通过使用$emit向父组件传参,还有诸如 $paren ...

  3. vue自动滚动组件 可以支持鼠标滚轮操作

    vue自动滚动组件 可以支持鼠标滚轮操作 <!-- *@AutoScrollList *@author GYY *@date 2022/7/20 11:22 --> <templat ...

  4. vue 自动px单位自动转换rem

    vue 自动px单位自动转换rem vue 适配移动端 假设设计图是750 第一步 安装 lib-flexible npm i lib-flexible --save 第二步 px2rem-loade ...

  5. 【Unity3D日常开发】生成预制体,并且预制体自动销毁

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 今天有粉丝问我一个很简单的问题,如何生成预制体,并且让预制体自动销 ...

  6. vue 自动填充_通过邮政编码与Ziptastic自动填充城市和州

    vue 自动填充 作者 克里斯·科耶尔 最近更新时间 2017年4月23日 翻译自: https://css-tricks.com/using-ziptastic/ vue 自动填充

  7. Vue事件总线(EventBus)、$on、$emit、$off

    在之前我们只用过父传子,子传父进行传数据,这时候当组件嵌套比较深或比较复杂的情况,这时候就用到了事件总线 (EventBus)  如何理解事件总线呢,你可以理解为用来传输数据的一条线 注意点:有组件发 ...

  8. vue组件销毁重置详解

    v-if方式 :key方式 $destroy v-if方式 <template><third-comp v-if="reFresh"/> </temp ...

  9. vscode输入vue自动_vscode配置总结可收藏/vscode用户设置大全/vue代码模板,vscodevue...

    vscode配置总结可收藏/vscode用户设置大全/vue代码模板,vscodevue ​ ​ //用户设置 { //-------- 搜索配置 -------- "search.excl ...

最新文章

  1. MySQL常见面试题及答案汇总1000道(春招+秋招+社招)
  2. 如何将oracle数据库中的表结构导入到sqlserver中,Oracle转换成SqlServer数据库的步骤...
  3. udhcpd解析域名_Linux作DHCP服务器之三3.dhcpd.leasesdhcpd.leases是DHCP客户.doc
  4. 信息系统项目管理师优秀论文:项目风险管理
  5. SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
  6. python3怎么安装gmpy2_python2/3 模块gmpy2在linux下安装
  7. WordPress数据库管理中五个实用的phpMyAdmin技巧
  8. Java 多线程(一)
  9. redhat7.3安装yum源 基于外网的http服务
  10. [LeetCode]:116:Populating Next Right Pointers in Each Node
  11. Android打开App2SD
  12. zookeeper集群为什么是单数
  13. 一个有趣的例子,JS+CSS实现【兴趣是最好的老师】
  14. eclipse导入不到嵌套的项目
  15. 无人机航模新手100 问
  16. HCSE交换知识重点
  17. 汇编rep movsb,rep stosb,repne scasb
  18. OpenGL 纹理映射(贴图) 学习
  19. java实现文字识别营业执照识别(百度、讯飞)
  20. SOAP实例入门(转)

热门文章

  1. 消息推送——产品运营不可或缺的用户触达方式
  2. maven工程一直显示红叉叉
  3. oledb vc访问mdb数据库_VC中连接mdb数据库及其数据读取方法
  4. Linux基础--访问命令行
  5. 国二c语言题型,计算机二级C语言题型和评分标准
  6. 改变MFC对话框背景色、控件内的字体颜色和背景色
  7. 清理项目中的无用资源
  8. Spark调优之 -- Spark的并行度深入理解(别再让资源浪费了)
  9. java 加密工具包_Java加密和解密算法调用工具包
  10. ptp虚拟服务器配置,Trimble高精度网络授时服务器 PTP GM200