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中实现命名空间
Nov 23 Javascript
javascript 时间比较实现代码
Oct 28 Javascript
关于JavaScript中string 的replace
Apr 12 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
Nov 09 Javascript
Bootstrap所支持的表单控件实例详解
May 16 Javascript
jQuery+CSS3实现点赞功能
Mar 13 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
Jul 28 Javascript
JS闭包原理与应用经典示例
Dec 20 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
原生JavaScript实现简单五子棋游戏
Jun 28 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
香妃
2021/03/03 冲泡冲煮
PHP新手上路(六)
2006/10/09 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python的urllib模块显示下载进度示例
2014/01/17 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
机械电子工程专业推荐信范文
2013/11/20 职场文书
初中校园之声广播稿
2014/01/15 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL