当前位置:首页 > JavaScript

js实现bus

2026-04-06 17:30:42JavaScript

实现事件总线(Bus)的方法

事件总线(Bus)是一种用于组件间通信的机制,允许不同组件通过发布(publish)和订阅(subscribe)事件来交互。以下是使用 JavaScript 实现事件总线的几种方法。

使用自定义事件类

创建一个简单的 EventBus 类,管理事件的订阅和发布:

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

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

  publish(eventName, ...args) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => callback(...args));
    }
  }

  unsubscribe(eventName, callback) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      this.events[eventName] = callbacks.filter(cb => cb !== callback);
    }
  }
}

// 使用示例
const bus = new EventBus();
bus.subscribe('event1', (data) => console.log('Event1:', data));
bus.publish('event1', 'Hello World');

使用 Vue 的事件总线模式

Vue 中可以通过创建一个空的 Vue 实例作为事件总线:

import Vue from 'vue';
const bus = new Vue();

// 订阅事件
bus.$on('event-name', (data) => {
  console.log('Event received:', data);
});

// 发布事件
bus.$emit('event-name', { message: 'Hello' });

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

使用 Node.js 的 EventEmitter

Node.js 内置的 events 模块提供了 EventEmitter 类,可以直接用作事件总线:

const EventEmitter = require('events');
const bus = new EventEmitter();

// 订阅事件
bus.on('event', (data) => {
  console.log('Event data:', data);
});

// 发布事件
bus.emit('event', { key: 'value' });

// 取消订阅
bus.off('event', listenerFunction);

使用第三方库

一些第三方库如 mitttiny-emitter 提供了轻量级的事件总线实现:

js实现bus

// 使用 mitt
import mitt from 'mitt';
const bus = mitt();

bus.on('event', (data) => console.log(data));
bus.emit('event', 'Hello');

// 使用 tiny-emitter
import { TinyEmitter } from 'tiny-emitter';
const emitter = new TinyEmitter();

emitter.on('event', (data) => console.log(data));
emitter.emit('event', 'World');

注意事项

  • 避免内存泄漏,及时取消不再需要的事件订阅。
  • 事件总线适合小型应用或简单场景,复杂状态管理建议使用专门的工具(如 Vuex、Redux)。
  • 命名冲突问题可以通过命名空间或前缀解决。

标签: jsbus
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…