当前位置:首页 > 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:

vue实现发布订阅模式

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

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rout…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

vue实现导入

vue实现导入

Vue 实现文件导入功能 使用 <input type="file"> 元素 在 Vue 模板中添加一个文件输入元素,绑定 change 事件处理函数。 <template>…