当前位置:首页 > VUE

vue实现发布订阅模式

2026-01-22 10:52:41VUE

发布订阅模式简介

发布订阅模式(Pub-Sub)是一种消息通信模式,发布者(Publisher)和订阅者(Subscriber)通过事件中心(Event Bus)解耦。Vue 本身基于观察者模式实现响应式系统,但可通过自定义事件机制模拟发布订阅模式。

基于 Vue 的自定义事件实现

Vue 实例提供 $on$emit$off 方法,可直接用于发布订阅逻辑。

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

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

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

// 取消订阅
eventBus.$off('event-name');

封装独立的 Event Bus 类

通过继承 Vue 或封装原生事件机制实现更独立的模块:

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

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

  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(cb => cb(...args));
    }
  }

  off(event, callback) {
    if (this.events[event]) {
      this.events[event] = this.events[event].filter(cb => cb !== callback);
    }
  }
}

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

在 Vue 组件中的应用

通过全局注入或按需引入 Event Bus:

// main.js 中全局挂载
Vue.prototype.$eventBus = new Vue();

// 组件内使用
export default {
  created() {
    this.$eventBus.$on('global-event', this.handleEvent);
  },
  methods: {
    handleEvent(payload) {
      console.log('全局事件触发:', payload);
    }
  },
  beforeDestroy() {
    this.$eventBus.$off('global-event');
  }
}

注意事项

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

替代方案

  • Vuex:适合复杂状态管理,内置事件系统。
  • 第三方库:如 mitt(轻量级 Event Bus)。
// mitt 示例
import mitt from 'mitt';
const emitter = mitt();
emitter.on('event', () => {});
emitter.emit('event');

vue实现发布订阅模式

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

相关文章

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <t…

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm ins…

vue实现下拉刷新组件

vue实现下拉刷新组件

实现下拉刷新组件的核心思路 下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…