首页 >> js开发 >> js代码JavaScript中EventBus实现对象之间通信
js代码JavaScript中EventBus实现对象之间通信
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
一、什么是EventBus? 一、什么是EventBus? 一、什么是EventBus?我个人理解:EventBus 可以实现对象之间的通信,当数据或某些特性发生改变时,能自动监听事件作出一些改变。还有的内容可能我还没有拓宽。怎么实现通信呢?这里通过一个例子可以理解到其中的精髓。
二、一个简单的例子
二、一个简单的例子二、一个简单的例子
add(){
data+=1;
render(data);
},
minus(){
data-=1;
render(data);
},
multiply(){
data*=2;
render(data);
},
divide(){
data/=2;
render(data);
},
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});
}
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四、使用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{
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时的还能有的变样,可以覆盖重写父类方法或者再添加一些方法。
二、一个简单的例子
二、一个简单的例子二、一个简单的例子
add(){
data+=1;
render(data);
},
minus(){
data-=1;
render(data);
},
multiply(){
data*=2;
render(data);
},
divide(){
data/=2;
render(data);
},
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});
}
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四、使用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{
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时的还能有的变样,可以覆盖重写父类方法或者再添加一些方法。