JavaScript中EventBus实现对象之间通信


Posted in Javascript onOctober 18, 2020

 一、什么是EventBus?

我个人理解:EventBus 可以实现对象之间的通信,当数据或某些特性发生改变时,能自动监听事件作出一些改变。还有更多的内容可能我还没有拓宽。怎么实现通信呢?这里通过一个例子可以理解到其中的精髓。

二、一个简单的例子

add(){
  data+=1;
  render(data);
},
minus(){
  data-=1;
  render(data);
},
multiply(){
  data*=2;
  render(data);
},
divide(){
  data/=2;
  render(data);
},

以上代码是进行加减乘除的运算,数据data改变后,对数据data进行渲染,调用到渲染函数render();

有没有觉得这样很麻烦,代码重复非常多,但是想表达的意思就是一个:data 只要进行更新,就调用一次渲染函数render()

问题来了:有没有办法简化呢?只要data一改变,就自动调用render()函数

三、代码演示实例

const eventbus=$({});  // 使用jQuery库创建了一个eventbus。

let xx = {
  data:{
    n:100,
  }
}

updata(data){
  Object.assign(xx.data,data);  //批量赋值

  eventbus.trigger('updataed:xx.data');  //触发事件,事件名为:'updataed:xx.data'
}

/* 调用jquer封装的事件监听函数 */
eventbus.on('updataed:xx.data',()=>{
  render(xx.data);
})

/* 改进后的加减乘除函数 */

add(){
  updata({n:xx.data.n+1});
},
minus(){
  updata({n:xx.data.n-1});
},
multiply(){
  updata({n:xx.data.n*2});
},
divide(){
  updata({n:xx.data.n/2});
}

只要一调用updata()函数,就会使eventbus.trigger('updataed:xx.data')触发,然后事件监听就会触发,自动调用render()函数进行渲染

四、使用class 封装+继承EventBus

class EventBus{
  constructor(){
    this.eventbus=$(window);  //使用jquery将eventbus挂载到全局window上
  }
  on(eventName,fn){
    this.eventbus.on(eventName,fn);
  }
  trigger(eventName){
    this.eventbus.trigger(eventName);
  }
  off(eventName,fn){
    this.eventbus.off(eventName,fn);
  }
}

const eventbus=new EventBus();

eventbus.trigger('updated:xx.data')
eventbus.on('updated:xx.data',()=>{
  render(xx.data);
})
eventbus.off('updated:xx.data')

/* 继承EventBus */

class module extends EventBus{
  constructor(){
    super();  //必须继承父类的构造函数constructor
  }
}

module.trigger('updated:xx.data')
module.on('updated:xx.data',()=>{
  render(xx.data);
})
module.off('updated:xx.data')

为何要进行class 封装和继承EventBus?

答:为了让代码更加格式化,不仅在这里能用到EventBus,在其他地方也能使用上。尤其在模块化的操作中,封装+继承这些就显得十分的重要。这样能让代码有更好的维护性。其他模块使用到eventbus时的还能有更多的变样,可以覆盖重写父类方法或者再添加一些方法。

到此这篇关于JavaScript中EventBus实现对象之间通信的文章就介绍到这了,更多相关JavaScript EventBus对象通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
Javascript select下拉框操作常用方法
Nov 09 Javascript
初试jQuery EasyUI 使用介绍
Apr 01 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
JS增加行复制行删除行的实现代码
Nov 09 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
Dec 24 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
原生js实现ajax方法(超简单)
Sep 20 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
jQuery插件ajaxFileUpload使用详解
Jan 10 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 #Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 #Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 #Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 #Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 #Javascript
vue自定义树状结构图的实现方法
Oct 18 #Javascript
axios封装与传参示例详解
Oct 18 #Javascript
You might like
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
Terran兵种介绍
2020/03/14 星际争霸
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
python函数的万能参数传参详解
2019/07/26 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python Http请求json解析库用法解析
2020/11/28 Python
python线程优先级队列知识点总结
2021/02/28 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
公司前台辞职报告
2014/01/19 职场文书
保护环境建议书400字
2014/05/13 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
保险公司演讲稿
2014/09/02 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL