Vue篇之事件总线(EventBus)

1,157 阅读1分钟

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);
},