当前位置:首页 > VUE

vue实现发布订阅模式

2026-02-23 01:54:19VUE

发布订阅模式简介

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

vue实现发布订阅模式

基于 Vue 的简单实现

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

vue实现发布订阅模式

// 创建事件中心
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实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结合…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…