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 相关文章推荐
document.forms[].submit()使用介绍
Feb 19 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
jquery获取节点名称
Apr 26 Javascript
javascript实现连续赋值
Aug 10 Javascript
使用JQuery实现智能表单验证功能
Mar 08 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
vue.js中$watch的用法示例
Oct 04 Javascript
微信小程序 绘图之饼图实现
Oct 24 Javascript
bootstrap table配置参数例子
Jan 05 Javascript
JS异步函数队列功能实例分析
Nov 28 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
Jan 13 Javascript
详解vue组件开发脚手架
Jun 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
附件名前加网站名
2008/03/23 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python 专题一 函数的基础知识
2017/03/16 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
先进事迹报告会感言
2014/01/24 职场文书
《悯农》教学反思
2014/04/28 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS