react中通过 EventEmitter 在组件间传递状态

news2025/4/18 9:47:32

要在 Reply 组件中通过 statusChangeEvent 发送状态值,并在 Select 组件中接收这个状态值 status,你可以按照以下步骤实现:

//Event.js

import EventEmitter from 'events';

export const statusChangeEvent = new EventEmitter();// 工单状态切换事件

1. 在 Reply 组件中发送状态值

你已经正确地在 Reply 组件中设置了事件发射:

// Reply.jsx
import { statusChangeEvent } from './Event';

const Reply = () => {
  const [status, setStatus] = useState('');
  
  const changeStatus = useCallback(status => {
    setStatus(status);
    statusChangeEvent.emit('status-changedValue', status);
  }, []);

  return (
    // 你的组件内容
    <button onClick={() => changeStatus('new-status')}>更改状态</button>
  );
};

2. 在 Select 组件中接收状态值

// Select.jsx
import { useEffect, useState } from 'react';
import { statusChangeEvent } from './Event';

const Select = () => {
  const [status, setStatus] = useState('');

  useEffect(() => {
    // 定义事件监听器
    const handleStatusChange = (newStatus) => {
      setStatus(newStatus);
    };

    // 添加事件监听
    statusChangeEvent.on('status-changedValue', handleStatusChange);

    // 组件卸载时移除监听
    return () => {
      statusChangeEvent.off('status-changedValue', handleStatusChange);
    };
  }, []);

  return (
    <div>
      <p>当前状态: {status}</p>
      {/* 其他组件内容 */}
    </div>
  );
};

3. 优化方案(推荐)

虽然 EventEmitter 可以工作,但在 React 中更推荐使用 Context 或状态管理库(如 Redux)来处理跨组件状态共享。以下是使用 Context 的替代方案:

创建状态上下文

// StatusContext.js
import { createContext, useContext, useState } from 'react';

const StatusContext = createContext();

export const StatusProvider = ({ children }) => {
  const [status, setStatus] = useState('');
  
  return (
    <StatusContext.Provider value={{ status, setStatus }}>
      {children}
    </StatusContext.Provider>
  );
};

export const useStatus = () => useContext(StatusContext);

在 Reply 组件中使用

// Reply.jsx
import { useStatus } from './StatusContext';

const Reply = () => {
  const { setStatus } = useStatus();
  
  const changeStatus = useCallback(status => {
    setStatus(status);
  }, [setStatus]);

  return (
    <button onClick={() => changeStatus('new-status')}>更改状态</button>
  );
};

在 Select 组件中使用

// Select.jsx
import { useStatus } from './StatusContext';

const Select = () => {
  const { status } = useStatus();
  
  return (
    <div>
      <p>当前状态: {status}</p>
    </div>
  );
};

在应用顶层包裹 Provider

// App.js
import { StatusProvider } from './StatusContext';

function App() {
  return (
    <StatusProvider>
      <Reply />
      <Select />
    </StatusProvider>
  );
}

注意事项

  1. EventEmitter 方案

    • 适合非父子组件间的通信

    • 记得在组件卸载时移除监听器

    • 可能导致难以追踪的数据流

  2. Context 方案

    • React 推荐的方式

    • 更易于维护和调试

    • 当状态变化时,所有使用该状态的组件都会重新渲染

  3. 性能考虑

    • 如果状态更新频繁,考虑使用 useMemo 或 React.memo 优化性能

    • 对于复杂应用,Redux 或 Zustand 可能是更好的选择

选择哪种方案取决于你的应用复杂度和组件结构。对于简单场景,EventEmitter 足够;对于更复杂的应用,推荐使用 Context 或状态管理库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库实验:分组查询与聚集函数的使用

目录 引言一、GROUP BY核心规则与常见错误二、高级分组选项&#xff1a;ROLLUP、CUBE与GROUPING SETS三、窗口函数&#xff1a;在原始行中显示分组聚合结果四、UNION ALL合并结果集&#xff1a;解决冗余查询问题五、实验体会 结语 &#xff08;附上实验中表格的信息&#xff09…

Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据

前言 本来针对Open-TeleVision的源码解析&#xff0c;是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot&#xff1a;如何基于宇树人形进行二次开发》中的&#xff0c;但考虑到为避免篇幅过长&#xff0c;故独立成此文 第一部分 Open-TeleVision的源码解析 如本…

推流265视频,网页如何支持显示265的webrtc

科技发展真快&#xff0c;以前在网页上&#xff08;一般指谷歌浏览器&#xff09;&#xff0c;要显示265的视频流&#xff0c;都是很鸡肋的办法&#xff0c;要么转码&#xff0c;要么用很慢的hls&#xff0c;体验非常不好&#xff0c;而今谷歌官方最新的浏览器已经支持265的web…

“破解”GPT-4o生图技术:万物皆可吉卜力的技术路线推测

&#x1f449;目录 1 GPT-4o 的神奇魔法 2 GPT-4o 可能的技术路线推测 3 结语 最近 GPT-4o 生图模型横空出世&#xff0c;效果和玩法上都有突破性的进展&#xff0c;笔者整理了一下目前相关的技术&#xff0c;抛砖引玉一下&#xff0c;希望有更多大神分享讨论。 图源小红书恶魔…

基于SpringBoot的电影订票系统(源码+数据库+万字文档+ppt)

504基于SpringBoot的电影订票系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户主要功能如下。 【用户功能】 首页&#xff1a;浏览系统电影动态。 资讯信息&#xff1a;获取有关电影行业的新闻和资讯。 电影信息&#xff1a;查看电影的详细信息和排片情况。 公告信…

07-算法打卡-链表-移除链表-leetcode(203)-第七天

1 题目地址 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a;[https://assets.leetc…

在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布

2025年4月11日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.7 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;Oracle数据源支持获取和查询物化视图&#xff1b;图表方面&#xff0c;在线地图支持天地图、腾讯地图&#xff1b;新增子弹图&…

粉末冶金齿轮学习笔记分享

有一段小段时间没有更新了&#xff0c;不知道小伙们有没有忘记我。最近总听到粉末冶金齿轮这个概念&#xff0c;花点时间来学习一下&#xff0c;总结一篇笔记分享给大家。废话不多说&#xff0c;直接开始&#xff1a; “粉末冶金”是一种制造工艺&#xff0c;包括在高压下压实…

Retina:部署在神经硬件的SNN眼动追踪算法

论文链接&#xff1a;Retina : Low-Power Eye Tracking with Event Camera and Spiking Hardware 这是一篇发表在2024CVPRW上的文章&#xff0c;做了三个contribution&#xff1a; 将SNN放在Eye Tracking任务上。提出了Ini-30数据集部署到了Spike硬件上 还是挺有趣的。但是由于…

OCR API识别对比

OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…

flutter 桌面应用之右键菜单

​在 Flutter 桌面应用开发中&#xff0c;context_menu 和 contextual_menu 是两款常用的右键菜单插件&#xff0c;各有特色。以下是对它们的对比分析&#xff1a;​ context_menu 集成方式&#xff1a;​通过 ContextMenuArea 组件包裹目标组件&#xff0c;定义菜单项。​掘金…

Cygwin编译安装Acise

本文记录Windows下使用Cygwin编译安装Acise的流程。 零、环境 操作系统Windows11Visual Studio CodeVisual Studio Code 1.92.0Cygwin 一、工具及依赖 1.1 Visual Studio Code 下载并安装Visual Studio Code, 同时安装以下插件&#xff0c; Task Explorer Output Colorizer …

pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错

1. 需求是这个样子的 有一个 pyqtgraph.opengl.GLViewWidget &#xff0c;在应用启动时存在QMainWindow中&#xff0c;即父对象是QMainWindow&#xff0c;当业务需要时&#xff0c;修改它的父对象变为一个QDialog&#xff0c;可以让它从QMainWindow中弹出显示在QDialog里&#…

【C++初学】课后作业汇总复习(六) 函数模板

1、函数模板 思考&#xff1a;如果重载的函数&#xff0c;其解决问题的逻辑是一致的、函数体语句相同&#xff0c;只是处理的数据类型不同&#xff0c;那么写多个相同的函数体&#xff0c;是重复劳动&#xff0c;而且还可能因为代码的冗余造成不一致性。 解决&#xff1a;使用…

【第16届蓝桥杯C++C组】--- 数位倍数

Hello呀&#xff0c;小伙伴们&#xff0c;第16届蓝桥杯也完美结束了&#xff0c;无论大家考的如何&#xff0c;都要放平心态&#xff0c;今年我刚上大一&#xff0c;也第一次参加蓝桥杯&#xff0c;刷的算法题也只有200来道&#xff0c;但是还是考的不咋滴&#xff0c;但是拿不…

Numpy和OpenCV库匹配查询,安装OpenCV ABI错误

文章目录 地址opencv-python&#xff1a;4.x版本的对应numpyopencv-python&#xff1a;5.x版本的对应numpy方法2 ps&#xff1a;装个opencv遇到ABI错误无语了&#xff0c;翻了官网&#xff0c;github文档啥都没&#xff0c;记录下 地址 opencv-python&#xff1a;4.x版本的对应…

ubuntu18.04安装miniforge3

1.下载安装文件 略&#xff08;注&#xff1a;从同事哪里拖来的安装包&#xff09; 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…

智能手机功耗测试

随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…

使用U盘安装 ubuntu 系统

1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载&#xff0c;本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘&#xff0c;不能选错了&#xff1b;点…

oracle 并行度(Parallel Degree)

在Oracle数据库中&#xff0c;并行度&#xff08;Parallel Degree&#xff09; 是用于控制并行处理任务的关键配置&#xff0c;旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度&#xff08;DOP, Degree of Parallelism&#xff09; 表示一个操作同时使用的并…