当前位置:首页 > 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
分享给朋友:

相关文章

js实现轮播

js实现轮播

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

js实现选项卡

js实现选项卡

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

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js 实现全屏

js 实现全屏

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

js实现刷新页面

js实现刷新页面

刷新页面的方法 在JavaScript中,可以通过多种方式实现页面刷新。以下是几种常见的方法: 使用 location.reload() 调用 location.reload() 方法可以重新加载当…