当前位置:首页 > JavaScript

js实现总线

2026-04-07 05:04:13JavaScript

实现事件总线(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);
    }
  }

  once(eventName, callback) {
    const wrapper = (...args) => {
      callback(...args);
      this.off(eventName, wrapper);
    };
    this.on(eventName, wrapper);
  }
}

使用示例

const bus = new EventBus();

// 订阅事件
bus.on('message', (text) => {
  console.log(`Received: ${text}`);
});

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

// 一次性订阅
bus.once('alert', (msg) => {
  console.log(`Alert: ${msg}`);
});

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

高级功能扩展

  1. 支持命名空间
    
    class NamespacedEventBus extends EventBus {
    constructor() {
     super();
     this.namespaces = {};
    }

getNamespace(ns) { if (!this.namespaces[ns]) { this.namespaces[ns] = new EventBus(); } return this.namespaces[ns]; } }


2. 支持异步事件
```javascript
async emitAsync(eventName, ...args) {
  const callbacks = this.events[eventName];
  if (callbacks) {
    await Promise.all(callbacks.map(callback => callback(...args)));
  }
}
  1. 错误处理增强
    emit(eventName, ...args) {
    const callbacks = this.events[eventName];
    if (callbacks) {
     callbacks.forEach(callback => {
       try {
         callback(...args);
       } catch (e) {
         console.error(`Event ${eventName} handler error:`, e);
       }
     });
    }
    }

实际应用场景

  1. Vue.js 中的事件总线
    
    // 创建总线
    const EventBus = new Vue();

// 组件A发送事件 EventBus.$emit('update', data);

// 组件B接收事件 EventBus.$on('update', (data) => { // 处理数据 });

js实现总线


2. React 中的跨组件通信
```javascript
// 创建全局总线实例
export const bus = new EventBus();

// 组件内使用
useEffect(() => {
  const handler = (data) => setState(data);
  bus.on('data-update', handler);
  return () => bus.off('data-update', handler);
}, []);

性能优化建议

  1. 使用WeakMap存储事件处理函数,避免内存泄漏
  2. 对于高频事件,考虑使用防抖或节流
  3. 实现事件优先级机制
  4. 添加事件拦截器中间件

这个实现提供了事件总线的基本功能,可以根据具体需求进行扩展和优化。在大型应用中,可能需要考虑更完善的状态管理方案如Redux或Vuex。

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

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…