当前位置: 首页 > news >正文

【大前端】React 父子组件通信、子父通信、以及兄弟(同级)组件通信

在 React 中,组件之间的通信是核心问题之一。可以分为三类:父子组件通信子父通信、以及兄弟(同级)组件通信。我给你梳理一下常见方式和对应示例:


一、父子组件通信

父组件通过 props 将数据或方法传递给子组件。

// Parent.tsx
import React, { useState } from "react";
import Child from "./Child";export default function Parent() {const [message, setMessage] = useState("Hello from Parent!");return <Child text={message} />;
}// Child.tsx
import React from "react";export default function Child({ text }: { text: string }) {return <h2>{text}</h2>;
}

👉 这是 React 中最常见的方式,数据单向流动。


二、子父组件通信(回调函数)

子组件通过调用父组件传递下来的 回调函数 来“通知”父组件。

// Parent.tsx
import React, { useState } from "react";
import Child from "./Child";export default function Parent() {const [msgFromChild, setMsgFromChild] = useState("");const handleChildMsg = (msg: string) => {setMsgFromChild(msg);};return (<div><Child onSend={handleChildMsg} /><p>子组件发来的消息: {msgFromChild}</p></div>);
}// Child.tsx
import React from "react";export default function Child({ onSend }: { onSend: (msg: string) => void }) {return (<button onClick={() => onSend("Hello Parent!")}>发送消息给父组件</button>);
}

三、同级组件通信(兄弟组件通信)

兄弟组件无法直接通信,需要通过共同的父组件全局状态管理 来中转。

方式 1:借助共同父组件

// Parent.tsx
import React, { useState } from "react";
import ChildA from "./ChildA";
import ChildB from "./ChildB";export default function Parent() {const [msg, setMsg] = useState("");return (<div><ChildA onSend={setMsg} /><ChildB message={msg} /></div>);
}// ChildA.tsx
import React from "react";export default function ChildA({ onSend }: { onSend: (msg: string) => void }) {return <button onClick={() => onSend("来自 A 的消息")}>发送给B</button>;
}// ChildB.tsx
import React from "react";export default function ChildB({ message }: { message: string }) {return <p>B 收到: {message}</p>;
}

方式 2:使用 Context(跨层级共享数据)

适合较复杂的场景,避免“层层传 props”。

import React, { createContext, useContext, useState } from "react";const MsgContext = createContext<any>(null);export default function Parent() {const [msg, setMsg] = useState("");return (<MsgContext.Provider value={{ msg, setMsg }}><ChildA /><ChildB /></MsgContext.Provider>);
}function ChildA() {const { setMsg } = useContext(MsgContext);return <button onClick={() => setMsg("ChildA 发来消息")}>发消息</button>;
}function ChildB() {const { msg } = useContext(MsgContext);return <p>B 收到: {msg}</p>;
}

方式 3:状态管理库(Redux、Zustand、Recoil)

适合大型项目,状态多、组件复杂时使用。


✅ 总结:

  • 父子通信props
  • 子父通信:回调函数。
  • 同级通信:提升状态到父组件,或者用 Context/全局状态库。

http://www.dtcms.com/a/364907.html

相关文章:

  • 科技赋能田园:数字化解决方案开启智慧农业新篇章
  • centos9 docker启动不起来,docker启动发生堵塞问题!
  • 【明道云】[工作表控件5] 手机控件的格式化处理
  • 【机器学习】实战:市场增长点分析挖掘项目
  • SyncBack 备份同步软件: 使用增量备份, 节省网络传输及存储成本
  • 【NVIDIA B200】2.all_reduce_perf NVIDIA B200 8-GPU 系统 All-Reduce 性能深度解析
  • 力扣115:不同的子序列
  • 热烈庆祝 | 一二三物联网携这款产品入选2025年度山东省首台(套)技术装备生产企业及产品名单
  • Day20 JavaScript 进阶核心:IIFE、代码规范、调试与对象模型
  • AI优化SEO关键词策略指南
  • 时序数据库选型指南:Apache IoTDB快速部署与实战应用
  • 时序数据库IoTDB的核心优势
  • mysql第五天学习 Mysql全局优化总结
  • 如何使文件夹内的软件或者文件不受windows 安全中心的监视
  • FastGPT社区版大语言模型知识库、Agent开源项目推荐
  • 智慧用电安全解决方案:打造全流程可视化管控
  • 知微集:Python中的线程Thread(一)
  • MCP是什么? 小白如何学习使用MCP?一篇文档带你详细了解神秘的MCP
  • 【C++】控制台输入与输出
  • osgb转b3dm转glb小工具流程-解决办法
  • Linux内核进程管理子系统有什么第四十一回 —— 进程主结构详解(37)
  • 《用 Flask 构建用户认证系统:从零开始实现注册与登录功能》
  • 10.2 工程学中的矩阵(2)
  • 基于Docker和Kubernetes的CI/CD流水线架构设计与优化实践
  • 加解密安全-侧信道攻击
  • AI Waifu RAT:新型恶意软件伪装AI助手劫持用户电脑
  • OpenLayers常用控件 -- 章节一:地图缩放控件详解教程
  • Java 反序列化漏洞
  • 专题四_前缀和_一维前缀和
  • JAVA 十二幕啦啦啦啦啦啦啦啊啦啦啦啦a