vue通信方式EventBus的实现代码详解


Posted in Javascript onJune 10, 2019

vue通信方式有很多,项目中用的比较多的的有 pros、vuex、$emit/$on 这3种,还有 provide/inject (适合高阶组件)、 $attrs$listeners (适合高阶组件)以及 $parent/$child/refeventBus 等这3种方式。很多时候我们都是只会使用api,而懂得原理以及实现,但我就觉得懂得原理以及实现跟一个只会调用api的开发人员时不在同一层次的。所以这里就像把跨组件通信的 eventBus 通信的原理给大家展示一下。这也是自己学到大佬的的东西后并在此记录(转载)一下。

class EventBus{
    constructor(){
      this.event=Object.create(null);
    };
    //注册事件
    on(name,fn){
      if(!this.event[name]){
        //一个事件可能有多个监听者
        this.event[name]=[];
      };
      this.event[name].push(fn);
    };
    //触发事件
    emit(name,...args){
      //给回调函数传参
      this.event[name]&&this.event[name].forEach(fn => {
        fn(...args)
      });
    };
    //只被触发一次的事件
    once(name,fn){
      //在这里同时完成了对该事件的注册、对该事件的触发,并在最后并取消该事件。
      const cb=(...args)=>{
        //触发
        fn.apply(this,args);
        //取消
        this.off(name,fn);
      };
      //监听
      this.on(name,cb);
    };
    //取消事件
    off(name,offcb){
      if(this.event[name]){
        let index=this.event[name].findIndex((fn)=>{
          return offcb===fn;
        })
        this.event[name].splice(index,1);
        if(!this.event[name].length){
          delete this.event[name];
        }
      }
    }
  }

以上代码用的是发布订阅模式。

总结

以上所述是小编给大家介绍的vue通信方式EventBus的实现代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
吐槽一下我所了解的Node.js
Oct 08 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
老生常谈原生JS执行环境与作用域
Nov 22 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
vue按需引入element Transfer 穿梭框
Sep 30 Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
Vue将页面导出为图片或者PDF
Aug 17 #Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
Jun 10 #jQuery
发布订阅模式在vue中的实际运用实例详解
Jun 09 #Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 #Javascript
解决vue单页面应用中动态修改title问题
Jun 09 #Javascript
Vue动态修改网页标题的方法及遇到问题
Jun 09 #Javascript
详解Node.js异步处理的各种写法
Jun 09 #Javascript
You might like
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
python实现维吉尼亚加密法
2019/03/20 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
flask实现验证码并验证功能
2019/12/05 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
大专毕业生自我评价分享
2013/11/10 职场文书
北体毕业生求职信
2014/02/28 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
谢师宴答谢词
2015/01/05 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js