当前位置:首页 > VUE

vue实现发布订阅模式

2026-02-23 01:54:19VUE

发布订阅模式简介

发布订阅模式(Pub/Sub)是一种消息通信范式,发布者(Publisher)不直接发送消息给订阅者(Subscriber),而是通过事件中心(Event Channel)进行中转。Vue 本身通过 $emit$on 提供了简单的实现,但可以进一步扩展为更通用的方案。

基于 Vue 的简单实现

Vue 实例本身可作为事件中心,利用 $emit$on 实现基础的发布订阅:

// 创建事件中心
const eventBus = new Vue();

// 订阅事件
eventBus.$on('event-name', (payload) => {
  console.log('收到消息:', payload);
});

// 发布事件
eventBus.$emit('event-name', { data: 'test' });

独立事件中心类

若需脱离 Vue 实例,可封装一个独立的 EventBus 类:

class EventBus {
  constructor() {
    this.events = {};
  }

  // 订阅
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }

  // 发布
  emit(event, ...args) {
    const callbacks = this.events[event];
    if (callbacks) {
      callbacks.forEach(cb => cb(...args));
    }
  }

  // 取消订阅
  off(event, callback) {
    const callbacks = this.events[event];
    if (callbacks) {
      this.events[event] = callbacks.filter(cb => cb !== callback);
    }
  }
}

// 使用示例
const bus = new EventBus();
bus.on('update', data => console.log(data));
bus.emit('update', '新数据');

结合 Vue 的 provide/inject

在 Vue 应用中,可通过 provideinject 共享事件总线:

// 父组件提供事件总线
const EventBus = new Vue();
export default {
  provide() {
    return { eventBus: EventBus };
  }
};

// 子组件注入并使用
export default {
  inject: ['eventBus'],
  mounted() {
    this.eventBus.$on('event', this.handleEvent);
  },
  methods: {
    handleEvent(payload) { /* ... */ }
  }
};

注意事项

  • 内存泄漏:组件销毁时需通过 $off 清理订阅。
  • 命名冲突:事件名建议使用命名空间(如 user:updated)。
  • 性能:高频事件需考虑防抖或节流。

替代方案

  • Vuex:适合全局状态管理,但复杂度较高。
  • 第三方库:如 mitttiny-emitter,提供更轻量的实现。

vue实现发布订阅模式

标签: 模式vue
分享给朋友:

相关文章

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition…

django vue实现

django vue实现

Django与Vue.js整合实现方案 Django作为后端框架与Vue.js作为前端框架的整合,可以通过以下方式实现: 分离式开发 前后端完全分离,Django仅提供API接口,Vue.js通过a…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HT…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…