当前位置:首页 > JavaScript

js实现总线

2026-02-02 11:32:42JavaScript

实现总线模式的方法

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

自定义事件总线类

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

js实现总线

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接口,可直接用于简单场景:

js实现总线

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实例实现跨组件通信:

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

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

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

注意事项

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

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

相关文章

实现Vue事件总线

实现Vue事件总线

使用 EventBus 实现全局事件通信 在 Vue 中,可以通过创建一个独立的 Vue 实例作为事件总线(EventBus)来实现组件间的通信。这种方法适用于非父子组件或跨层级组件之间的通信。 创…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…