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 相关文章推荐
jquery 输入框数字限制插件
Nov 10 Javascript
JS在textarea光标处插入文本的小例子
Mar 22 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
JavaScript数组去重的6个方法
Jan 21 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
js实现图片上传并预览功能
Aug 06 Javascript
vue+SSM实现验证码功能
Dec 07 Javascript
JavaScript生成随机验证码代码实例
Sep 28 Javascript
js实现金山打字通小游戏
Jul 24 Javascript
React Native登录之指纹登录篇的示例代码
Nov 03 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实现快速排序法函数代码
2012/08/27 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
详解jQuery事件
2017/01/13 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python自动发邮件脚本
2017/03/31 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
Python笔试面试题小结
2019/09/07 Python
Python实现word2Vec model过程解析
2019/12/16 Python
如何通过python实现全排列
2020/02/11 Python
python 写一个文件分发小程序
2020/12/05 Python
python statsmodel的使用
2020/12/21 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
小学三年级数学教学反思
2014/01/31 职场文书
培训专员岗位职责
2014/02/26 职场文书
销售人员求职信
2014/07/22 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
社会实践心得体会范文
2016/01/14 职场文书
合作意向书怎么写
2019/06/24 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android