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 相关文章推荐
免费空间广告万能消除代码
Sep 04 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
浅析js中2个等号与3个等号的区别
Aug 06 Javascript
jquery each的几种常用的使用方法示例
Jan 21 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
js文本框输入内容智能提示效果
Dec 02 Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 Javascript
JavaScript仿聊天室聊天记录
Dec 27 Javascript
layui.js实现的表单验证功能示例
Nov 15 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
Dec 12 Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 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
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
php实现word转html的方法
2016/01/22 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
体育专业学生自我评价范文
2014/01/17 职场文书
演讲稿格式范文
2014/05/19 职场文书
个人自荐书范文
2015/03/09 职场文书
入党介绍人意见2015
2015/06/01 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
MySQL三种方式实现递归查询
2022/04/18 MySQL