0

0

如何在 React 中正确地在兄弟组件间传递状态数据

碧海醫心

碧海醫心

发布时间:2026-02-12 17:43:43

|

878人浏览过

|

来源于php中文网

原创

如何在 React 中正确地在兄弟组件间传递状态数据

本文详解 react 应用中 toolbarelement 与 graphelement 两个兄弟组件间共享状态的正确实现方式,涵盖状态提升、可变性陷阱规避、异步数据流处理及 props 传递规范,避免因直接修改 props 导致的运行时错误。

在 React 中,子组件之间无法直接通信——它们必须通过共同的父组件(如 App.js)进行状态协调。你当前代码中的核心问题并非“传参语法”,而是对 React 状态机制的根本性误解:props 是只读的,不可被子组件直接修改。因此,ToolbarElement.js 中 state.graph_data = data.lst[0] 这一行会报错 Cannot set properties of undefined(因为 props.state 实际上是普通对象字面量,且 state 并未作为可变引用透传),同时 GraphElement 也无法响应式更新。

✅ 正确做法:状态提升(Lifting State Up)

将共享状态及其更新逻辑统一托管到父组件 App.js 中,再通过 props 单向向下传递状态值和更新函数

Face Swap Online
Face Swap Online

在线免费换脸,支持图片换脸和视频换脸

下载

1. 修改 App.js:使用 useState 管理可变状态

import React, { useState } from 'react';

function App() {
  // ✅ 使用 useState 创建响应式状态
  const [graphData, setGraphData] = useState(0);

  return (
    <div className="App">
      <div className="App-body">
        <div className="toolbar-element" style={{ top: "50px", left: "0px" }}>
          {/* ✅ 向 ToolbarElement 传递状态值 + 更新函数 */}
          <ToolbarElement graphData={graphData} setGraphData={setGraphData} />
        </div>
        <div className="graph-element" style={{ top: "50px", right: "0px" }}>
          {/* ✅ 向 GraphElement 仅传递状态值(只读) */}
          <GraphElement graphData={graphData} />
        </div>
      </div>
    </div>
  );
}

export default App;

2. 修改 ToolbarElement.js:触发异步请求并更新父状态

import React, { useState } from 'react';

function ToolbarElement({ graphData, setGraphData }) {
  const [loading, setLoading] = useState(false);

  const handleButtonClick = async () => {
    setLoading(true);
    try {
      const res = await fetch("/data");
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      const data = await res.json();

      // ✅ 安全校验:确保 data 是数组且非空
      if (Array.isArray(data) && data.length > 0) {
        setGraphData(data[0]); // ? 触发父组件状态更新,GraphElement 自动重渲染
      } else {
        console.warn("API returned empty or invalid data");
        setGraphData(null);
      }
    } catch (err) {
      console.error("Failed to fetch graph data:", err);
      setGraphData(null);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div style={{ height: '33.33%', backgroundColor: '#F0F0F0' }}>
      <button onClick={handleButtonClick} disabled={loading}>
        {loading ? 'Loading...' : 'Click me!'}
      </button>
    </div>
  );
}

export default ToolbarElement;

3. 修改 GraphElement.js:安全渲染状态

function GraphElement({ graphData }) {
  // ✅ 增强健壮性:处理 null/undefined 或非字符串类型
  const displayValue = graphData == null ? 'No data' : String(graphData);

  return (
    <div style={{ height: '33.33%', backgroundColor: '#E8E8E8' }}>
      <p>{displayValue}</p>
    </div>
  );
}

export default GraphElement;

⚠️ 关键注意事项

  • 永远不要修改 props:React 的 props 是不可变的契约,直接赋值(如 props.state.x = y)不仅无效,还会破坏组件一致性。
  • 避免在子组件中定义状态对象字面量:原 App.js 中 const state = { graph_data: 0 } 是静态对象,不具响应性;必须用 useState 或 useReducer。
  • 异步操作需错误处理:网络请求可能失败,务必包裹 try/catch 并提供 fallback 状态。
  • 类型安全建议:若项目使用 TypeScript,可为 graphData 添加明确类型(如 number | string | null),进一步规避运行时错误。
  • 性能优化(进阶):当 GraphElement 较复杂时,可用 React.memo 包裹防止不必要的重渲染。

通过以上重构,GraphElement 将能实时响应 ToolbarElement 的按钮点击,并安全展示从 Flask /data 接口获取的首项数据——整个流程符合 React 单向数据流原则,稳定、可维护、易调试。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

96

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

73

2025.12.15

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

708

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

705

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

542

2023.09.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1393

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

319

2025.10.17

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号