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;
相关推荐
鬼谷中妖3 分钟前
JavaScript 循环与对象:深入理解 for、for...in、for...of、不可枚举属性与可迭代对象
前端
大厂码农老A8 分钟前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
im_AMBER10 分钟前
CSS 01【基础语法学习】
前端·css·笔记·学习
DokiDoki之父14 分钟前
前端速通—CSS篇
前端·css
pixle017 分钟前
Web大屏适配终极方案:vw/vh + flex + clamp() 完美组合
前端·大屏适配·vw/vh·clamp·终极方案·web大屏
ssf198723 分钟前
前后端分离项目前端页面开发远程调试代理解决跨域问题方法
前端
@PHARAOH23 分钟前
WHAT - 前端性能指标(加载性能指标)
前端
尘世中一位迷途小书童28 分钟前
🎨 SCSS 高级用法完全指南:从入门到精通
前端·css·开源
非凡ghost33 分钟前
火狐浏览器(Firefox)tete009 Firefox 多语便携版
前端·firefox
文心快码BaiduComate33 分钟前
文心快码Comate3.5S更新,用多智能体协同做个健康管理应用
前端·人工智能·后端