react使用eventBus在不同模块间进行通信

1. eventBus 使用说明

eventBus 是一个事件总线(Event Bus)实例,用于在不同的组件或模块之间进行通信。它提供了 on、off 和 emit 方法来订阅、取消订阅和触发事件。以下是 eventBus 的详细使用方法:

2. 主要方法

on(eventName: string, callback: Callback): void

功能:订阅一个事件。

参数:

eventName:事件名称(字符串)。

callback:事件触发时执行的回调函数。

off(eventName: string, callback: Callback): void

功能:取消订阅一个事件。

参数:

eventName:事件名称(字符串)。

callback:要取消订阅的回调函数。

emit(eventName: string, ...args: any[]): void

功能:触发一个事件,并传递参数给所有订阅该事件的回调函数。

参数:

eventName:事件名称(字符串)。

...args:传递给回调函数的参数。

3. 使用

在项目中创建eventbus文件夹,里面创建index.tsx

js 复制代码
type Callback = (...args: any[]) => void

class EventBus {
  private events: Map<string, Callback[]>

  constructor() {
    this.events = new Map()
  }

  on(eventName: string, callback: Callback): void {
    if (!this.events.has(eventName)) {
      this.events.set(eventName, [])
    }
    this.events.get(eventName)?.push(callback)
  }

  off(eventName: string, callback: Callback): void {
    if (this.events.has(eventName)) {
      const callbacks: any = this.events.get(eventName)
      const index = callbacks.indexOf(callback)
      if (index !== -1) {
        callbacks.splice(index, 1)
      }
    }
  }

  emit(eventName: string, ...args: any[]): void {
    if (this.events.has(eventName)) {
      this.events.get(eventName)?.forEach(callback => {
        callback(...args)
      })
    }
  }
}

const eventBus = new EventBus()
export default eventBus

订阅事件

在组件 A 中订阅一个事件:

js 复制代码
import React, { useEffect } from 'react';
import eventBus from '@/packages/eventbus';

const ComponentA = () => {
  useEffect(() => {
    const handleEvent = (data: any) => {
      console.log('ComponentA received event:', data);
    };

    eventBus.on('myEvent', handleEvent);

    // 清理订阅
    return () => {
      eventBus.off('myEvent', handleEvent);
    };
  }, []);

  return <div>Component A</div>;
};

export default ComponentA;

触发事件

在组件 B 中触发该事件:

js 复制代码
import React from 'react';
import eventBus from '@/packages/eventbus';

const ComponentB = () => {
  const triggerEvent = () => {
    eventBus.emit('myEvent', { message: 'Hello from Component B!' });
  };

  return (
    <div>
      Component B
      <button onClick={triggerEvent}>Trigger Event</button>
    </div>
  );
};

export default ComponentB;
相关推荐
灵感__idea23 分钟前
JavaScript高级程序设计(第5版):前端的能力边界
前端·javascript·程序员
华洛24 分钟前
SEO还没死,GEO之战已经开始
前端·javascript·产品
IT_陈寒27 分钟前
Python性能优化:5个被低估的魔法方法让你的代码提速50%
前端·人工智能·后端
As331001036 分钟前
Chrome 插件开发入门指南:从基础到实践
前端·chrome
不想上班只想要钱43 分钟前
vue3 ts:声明的一个数组不能将类型“boolean”分配给类型“never”。
前端·vue.js
OEC小胖胖1 小时前
Next.js 介绍:为什么选择它来构建你的下一个 Web 应用?
开发语言·前端·web·next.js
切糕师学AI1 小时前
如何建立针对 .NET Core web 程序的线程池的长期监控
java·前端·.netcore
F2E_Zhangmo4 小时前
基于cornerstone3D的dicom影像浏览器 第三章 拖拽seriesItem至displayer上显示第一张dicom
前端·javascript·cornerstone·cornerstone3d·cornerstonejs
gnip9 小时前
Jst执行上下文栈和变量对象
前端·javascript
excel9 小时前
🐣 最简单的卷积与激活函数指南(带示例)
前端