当前位置:首页 > 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 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue实现绘图

vue实现绘图

Vue 实现绘图的方法 在 Vue 中实现绘图功能,可以通过多种方式实现,包括使用原生 HTML5 Canvas、第三方库(如 Fabric.js、Konva.js)或 SVG。以下是几种常见的实现方…

vue实现checkbox

vue实现checkbox

Vue 实现 Checkbox 在 Vue 中实现 Checkbox 可以通过原生 HTML 的 <input type="checkbox"> 或使用 Vue 的 v-model 指令绑…

vue实现的setdata

vue实现的setdata

Vue 中实现类似小程序 setData 的方法 在小程序中,setData 方法用于异步更新页面数据并触发视图渲染。Vue 中可以通过以下几种方式实现类似功能: 直接使用 Vue 的响应式系统 V…