一、什么是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时的还能有的变样,可以覆盖重写父类方法或者再添加一些方法。