当前位置:首页 > JavaScript

js实现总线

2026-02-02 11:32:42JavaScript

实现总线模式的方法

总线模式(Event Bus)是一种用于组件或模块间通信的设计模式,允许不同部分通过事件发布/订阅机制交互,而无需直接引用彼此。以下是JavaScript中实现总线模式的几种方法:

自定义事件总线类

通过类封装事件管理逻辑,提供on(订阅)、emit(发布)、off(取消订阅)等方法:

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

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

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

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

// 使用示例
const bus = new EventBus();
bus.on('message', (data) => console.log(data));
bus.emit('message', 'Hello EventBus');

使用浏览器原生API

现代浏览器支持CustomEventEventTarget接口,可直接用于简单场景:

const bus = new EventTarget();

// 订阅
bus.addEventListener('customEvent', (e) => {
  console.log(e.detail);
});

// 发布
bus.dispatchEvent(new CustomEvent('customEvent', {
  detail: { message: 'Hello' }
}));

基于第三方库

现有库如mittEventEmitter3提供更完善的实现:

// 使用mitt(体积仅200字节)
import mitt from 'mitt';
const bus = mitt();

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

Vue中的事件总线

Vue 2.x可通过空Vue实例实现跨组件通信:

js实现总线

// 创建总线
export const bus = new Vue();

// 组件A发布事件
bus.$emit('update', payload);

// 组件B订阅事件
bus.$on('update', (payload) => {...});

注意事项

  • 需处理内存泄漏,及时取消无用订阅
  • 大型项目建议结合状态管理工具(如Vuex/Pinia)
  • 避免过度使用导致代码难以维护
  • TypeScript项目可添加类型定义增强安全性

标签: 总线js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…

js实现放大缩小

js实现放大缩小

使用 CSS transform 实现缩放 通过修改元素的 transform 属性实现平滑缩放效果。CSS 的 scale() 函数可以轻松调整元素大小。 const element = docu…