EventBus的简介
EventBus 又称为事件总线。在Vue中可以使用 EventBus 来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件,但也就是太方便所以若使用不慎,就会造成难以维护的灾难,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。
如何使用EventBus
在Vue的项目中怎么使用 EventBus 来实现组件之间的数据通讯呢?具体可以通过下面几个步骤来完成。
初始化
首先你需要做的是创建事件总线并将其导出,以便其它模块可以使用或者监听它。我们可以通过两种方式来处理。先来看第一种,新创建一个 .js 文件,比如 event-bus.js :
// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()
你需要做的只是引入 Vue 并导出它的一个实例(在这种情况下,我称它为 EventBus )。实质上它是一个不具备 DOM 的组件,它具有的仅仅只是它实例方法而已,因此它非常的轻便。
另外一种方式,可以直接在项目中的 main.js 初始化 EventBus :
// main.js
Vue.prototype.$EventBus = new Vue()
注意,这种方式初始化的 EventBus 是一个 全局的事件总线 。稍后我们会花点时间专门聊一聊全局的事件总线。 现在我们已经创建了 EventBus ,接下来你需要做到的就是在你的组件中加载它,并且调用同一个方法,就如你在父子组件中互相传递消息一样。
项目中应用:
1.eventBus.js
import Vue from "vue";
var eventVue = new Vue();
var install = {
install(Vue) {
Vue.mixin({
beforeCreate() {
this.$eventBus = eventVue;
}
})
}
}
export default install;
2.main.js引入
import eventBus from "./libs/js/vueExtend/eventBus.js";
3.使用(发送)
mounted () {
window.setInterval(() => {
this.$eventBus.$emit('update-interface');
}, 29 * 1000 * 60);// 29分钟
this.$nextTick(async () => {
await this.onWindowResize();
window.addEventListener('resize', await this.onWindowResize);
});
},
4.使用(接收)
mounted(){
this.schoolId = this.$route.query.schoolId ? this.$route.query.schoolId : '';
this.$eventBus.$off('update-interface').$on('update-interface', this.reloadData);
},