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 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
简单三步,搞掂内存泄漏
Mar 10 Javascript
javascript textContent与innerText的异同分析
Oct 22 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 Javascript
使用JS CSS去除IE链接虚线框的三种方法
Nov 14 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
iScroll中事件点击触发两次解决方案
Mar 11 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
js实现消灭星星(web简易版)
Mar 24 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微信公众平台开发类实例
2015/04/01 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
jquery实现div阴影效果示例代码
2013/09/16 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python创造虚拟环境方法总结
2019/03/04 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
django使用admin站点上传图片的实例
2019/07/28 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
新浪网技术部笔试题
2016/08/26 面试题
大学生涯自我鉴定
2014/01/16 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android