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 鼠标拖动图标技术
Feb 07 Javascript
使用JS进行目录上传(相当于批量上传)
Dec 05 Javascript
JavaScript建立一个语法高亮输入框实现思路
Feb 26 Javascript
JavaScript 上万关键字瞬间匹配实现代码
Jul 07 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
Sep 15 Javascript
js读取注册表的键值示例
Sep 25 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
Dec 07 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
微信小程序一周时间表功能实现
Oct 17 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 Javascript
详解Java中String JSONObject JSONArray List转换
Nov 13 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP 引用文件技巧
2010/03/02 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python 创建一维的0向量实例
2019/12/02 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
python实现图片转字符画
2021/02/19 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
制药工程专业毕业生推荐信
2013/12/24 职场文书
军人违纪检讨书
2014/02/04 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
医院标语大全
2014/06/23 职场文书
食品安全演讲稿
2014/09/01 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
幼儿园教师教学反思
2016/03/02 职场文书