EventBus实现对象之间通信

825 阅读2分钟

eventBus实现对象之间通信

目录

  • 什么是EventBus?
  • 一个简单的例子
  • 代码演示实例(使用jquery演示)
  • 使用class 封装+继承EventBus

一、什么是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')

  1. 为何要进行class 封装和继承EventBus?

    答:为了让代码更加格式化,不仅在这里能用到EventBus,在其他地方也能使用上。尤其在模块化的操作中,封装+继承这些就显得十分的重要。这样能让代码有更好的维护性。其他模块使用到eventbus时的还能有更多的变样,可以覆盖重写父类方法或者再添加一些方法。