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面向对象编程
Mar 04 Javascript
Javascript下判断是否为闰年的Datetime包
Oct 26 Javascript
Javascript动画效果(2)
Oct 11 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
template.js前端模板引擎使用详解
Oct 10 Javascript
jquery自定义显示消息数量
Dec 19 jQuery
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
javascript面向对象三大特征之封装实例详解
Jul 24 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
基于VSCode调试网页JavaScript代码过程详解
Jul 20 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
axios基本入门用法教程
2017/03/25 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
前端性能优化建议
2020/09/17 Javascript
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
简单实现python收发邮件功能
2018/01/05 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Python中过滤字符串列表的方法
2020/12/22 Python
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
搞笑创意广告语
2014/03/17 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
幼师中班个人总结
2015/02/12 职场文书
担保书格式范文
2015/09/22 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python