vue bus实现原理
Vue Bus 实现原理
Vue Bus 是一种基于 Vue.js 的事件总线机制,用于在非父子组件之间进行通信。其核心原理是利用 Vue 实例的事件系统($emit、$on、$off)实现跨组件的事件发布与订阅。
核心机制
事件总线实例
创建一个空的 Vue 实例作为中央事件总线,所有组件通过该实例监听或触发事件。
// 创建事件总线
const bus = new Vue();
export default bus;
发布事件
通过 $emit 方法发布事件,可携带数据。
bus.$emit('event-name', data);
订阅事件
通过 $on 方法监听事件,并在回调中处理数据。
bus.$on('event-name', (data) => {
console.log('Received:', data);
});
取消订阅
通过 $off 移除事件监听,避免内存泄漏。
// 移除单个事件
bus.$off('event-name');
// 移除所有事件
bus.$off();
实现细节
单例模式
全局维护唯一的事件总线实例,确保所有组件访问的是同一个事件中心。
生命周期管理
通常在组件的 created 钩子中订阅事件,在 beforeDestroy 钩子中取消订阅,防止重复监听或内存泄漏。
与 Vuex 的对比
- 适用场景:
- Vue Bus 适合简单场景或小型应用的非父子通信。
- Vuex 适合复杂状态管理,提供数据响应式和调试工具。
- 数据流:
- Vue Bus 是无中心化的事件驱动,数据流向分散。
- Vuex 是集中式状态管理,数据流向明确。
代码示例
定义事件总线
// event-bus.js
import Vue from 'vue';
export const bus = new Vue();
组件 A(发布事件)
import { bus } from './event-bus.js';
export default {
methods: {
sendMessage() {
bus.$emit('message', 'Hello from Component A!');
}
}
}
组件 B(订阅事件)

import { bus } from './event-bus.js';
export default {
created() {
bus.$on('message', (msg) => {
console.log(msg); // 输出: Hello from Component A!
});
},
beforeDestroy() {
bus.$off('message');
}
}
注意事项
- 内存泄漏:未及时取消订阅会导致回调函数堆积,需在组件销毁时清理。
- 命名冲突:事件名建议使用命名空间(如
user:updated)避免重复。 - 替代方案:Vue 3 推荐使用
mitt或tiny-emitter等第三方库,因 Vue 3 移除了$on/$off方法。






