vue发布订阅的实现
Vue 发布订阅的实现
在 Vue 中,发布订阅模式(Pub/Sub)通常用于组件间的通信,尤其是非父子组件之间的通信。以下是几种常见的实现方式:
使用 Event Bus
Event Bus 是一个简单的 Vue 实例,用于在组件之间传递事件和数据。

// 创建 Event Bus
const EventBus = new Vue();
// 发布事件
EventBus.$emit('event-name', data);
// 订阅事件
EventBus.$on('event-name', (data) => {
console.log('Received data:', data);
});
// 取消订阅
EventBus.$off('event-name');
使用 Vuex
Vuex 是 Vue 的官方状态管理库,虽然主要用于状态管理,但也可以通过 mutations 和 actions 实现发布订阅模式。

// store.js
const store = new Vuex.Store({
state: {
events: {}
},
mutations: {
subscribe(state, { event, callback }) {
if (!state.events[event]) {
state.events[event] = [];
}
state.events[event].push(callback);
},
emit(state, { event, data }) {
if (state.events[event]) {
state.events[event].forEach(callback => callback(data));
}
}
}
});
// 订阅事件
store.commit('subscribe', {
event: 'event-name',
callback: (data) => {
console.log('Received data:', data);
}
});
// 发布事件
store.commit('emit', {
event: 'event-name',
data: { message: 'Hello World' }
});
使用第三方库
可以使用第三方库如 mitt 或 pubsub-js 来实现更轻量级的发布订阅模式。
// 使用 mitt
import mitt from 'mitt';
const emitter = mitt();
// 订阅事件
emitter.on('event-name', (data) => {
console.log('Received data:', data);
});
// 发布事件
emitter.emit('event-name', { message: 'Hello World' });
// 取消订阅
emitter.off('event-name');
自定义实现
如果需要更灵活的控制,可以自定义一个发布订阅模式。
class PubSub {
constructor() {
this.events = {};
}
subscribe(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
publish(event, data) {
if (this.events[event]) {
this.events[event].forEach(callback => callback(data));
}
}
unsubscribe(event, callback) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}
}
// 使用
const pubsub = new PubSub();
// 订阅
const callback = (data) => {
console.log('Received data:', data);
};
pubsub.subscribe('event-name', callback);
// 发布
pubsub.publish('event-name', { message: 'Hello World' });
// 取消订阅
pubsub.unsubscribe('event-name', callback);
以上方法可以根据具体需求选择适合的方式来实现 Vue 中的发布订阅模式。






