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 相关文章推荐
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
有关javascript的性能优化 (repaint和reflow)
Apr 12 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
基于angular2 的 http服务封装的实例代码
Jun 29 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
vue 使用ref 让父组件调用子组件的方法
Feb 08 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 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
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
35个Python编程小技巧
2014/04/01 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
广告学专业应届生求职信
2013/10/01 职场文书
政治学求职信
2014/06/03 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
个人四风对照检查材料
2014/09/26 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015学校年度工作总结
2015/05/11 职场文书
鸦片战争观后感
2015/06/09 职场文书
绿里奇迹观后感
2015/06/15 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书