当前位置:首页 > JavaScript

js实现bus

2026-03-14 23:49:01JavaScript

JavaScript 实现事件总线(Bus)

事件总线(Event Bus)是一种用于组件或模块间通信的机制,适用于发布-订阅模式。以下是一个简单的实现方案:

基础实现

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(callback => {
        callback(...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('Received:', data);
});

// 发布事件
bus.emit('message', 'Hello World');

// 取消订阅
const handler = (data) => console.log('Handler:', data);
bus.on('log', handler);
bus.off('log', handler);

高级功能扩展

  1. 一次性监听
once(eventName, callback) {
  const wrapper = (...args) => {
    callback(...args);
    this.off(eventName, wrapper);
  };
  this.on(eventName, wrapper);
}
  1. 异步事件支持
async emitAsync(eventName, ...args) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    await Promise.all(callbacks.map(cb => cb(...args)));
  }
}
  1. 错误处理增强
emit(eventName, ...args) {
  try {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => {
        try {
          callback(...args);
        } catch (err) {
          console.error(`Event ${eventName} handler error:`, err);
        }
      });
    }
  } catch (err) {
    console.error(`Event emit error:`, err);
  }
}

Vue 中的事件总线

在 Vue 2 中常这样使用:

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

// 组件A发送事件
bus.$emit('event-name', payload);

// 组件B接收事件
bus.$on('event-name', payload => {
  // 处理逻辑
});

注意事项

js实现bus

  • 避免内存泄漏,及时取消不再需要的事件监听
  • 大型项目建议使用专业状态管理工具(Vuex/Pinia等)
  • 事件命名建议采用常量管理,避免拼写错误

标签: jsbus
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现选项卡

js实现选项卡

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…