拿捏 React 组件通讯:从父子到跨组件的「传功秘籍」

前言

你有没有过这种崩溃时刻?写React 组件时,想让父子组件互通数据,结果代码越写越乱;兄弟组件想传个值,绕了八层父组件还没搞定…… 为啥别人的 React 组件传值丝滑?别慌!秘密都在这!今天咱们用「武侠传功」的思路,React 组件通讯的坑,一篇帮你填平!

一、父子组件:父传子的「单向秘籍」

想象一下:父组件武林盟主,手里有本《九阴真经》(变量),想传给子组件这个小徒弟。但规矩是:

徒弟只能看,不能改!

传功步骤:

  1. 父组件发功:在子组件标签上绑定属性(把秘籍递出去)
  2. 子组件接功:通过props接收(双手接住秘籍)

看个例子:

父组件(盟主)把state.name传给子组件:

// 父组件 Parent.jsx import Child from "./Child"; export default function Parent(props) { const state = { name: 'henry' // 这是要传的「秘籍」 }; return ( <div> <h2>父组件</h2> <Child msg = {state.name}/> {/* 绑定属性 msg,把秘籍递出去 */} </div> ); }

子组件(徒弟)用props接收,但不能修改(秘籍是只读的!):

// 子组件 Child.jsx export default function Child(props) { console.log(props); // 能看到 {msg: 'henry'} // props.msg = 'harvest'; // ❌ 报错!props 是只读的,不能改! return ( {/* 展示接收到的「秘籍」 */} <div>子组件 -- {props.msg}</div> ); }

打印结果如下:

如果修改值会报错(只读,不能改!):

二、子父组件:子传父的「反向传功」

这次反过来:子组件是徒弟,练出了新招式(变量),想传给父组件盟主。但徒弟不能直接塞给盟主,得让盟主递个「接收袋」(函数),徒弟把招式装进去

传功步骤:

  1. 父组件递袋:定义接收数据的函数(准备好接收袋)
  2. 父传子袋:把函数通过props传给子组件(把袋子递过去)
  3. 子组件装招:调用函数并传数据(把新招式装进袋子)代码例子:

父组件准备「接收袋」getNum,传给子组件:

// 父组件 Parent.jsx import Child from "./Child" import { useState } from "react"; export default function Parent() { let [count, setCount] = useState(1); // 定义「接收袋」:收到数据后更新自己的状态 const getNum = (n) => { setCount(n); } return ( <div> <h2>父组件二 -- {count}</h2> <Child getNum = {getNum}/> {/* 把袋子递过去 */} </div> ); }

子组件调用getNum,把自己的state.num传过去:

// 子组件 Child.jsx export default function Child(props) { const state = { num: 100 // 自己练的新招式 }; function send() { props.getNum(state.num); // 把新招式装进袋子 } return ( <div> <h3>子组件二</h3> <button onClick={send}>发送</button> {/* 点按钮传功 */} </div> ) }

点击发送前:

点击发送后:

这样我们就成功的把子组件的变量传给了父组件。这里我们用到了useState,至于它的作用我们暂时先不讲,我们先搞懂通讯。

三、兄弟组件:「父组件当中间商」

兄弟组件像两个师兄弟,想互相传功?得先把招式传给盟主父组件(中间商),再让父组件转给另一个兄弟。

传功步骤:

  1. 弟 1 传父:弟 1 把数据传给父组件
  2. 父传弟 2:父组件把数据传给弟 2

依旧代码:

父组件当中间商,接收 Child1 的数据,再传给 Child2:

// 父组件 Parent.jsx import { useState } from "react"; import Child1 from "./Child1" import Child2 from "./Child2" export default function Parent(props) { let [message, setMessage] = useState(); // 接收 Child1 的数据 const getMeg = (msg) => { setMessage(msg); } return ( <div> <h2>父组件三</h2> <Child1 getMeg = {getMeg} /> {/* 收 Child1 的数据 */} <Child2 msg = {message}/> {/* 把数据传给 Child2 */} </div> ) }

Child1(兄)传数据给父:

// Child1.jsx export default function Child1(props) { const state = { msg: '3.1' }; function send() { props.getMeg(state.msg); // 传给父组件 } return ( <div> <h3>子组件3.1</h3> <button onClick={send}>发送</button> </div> ) }

Child2(弟)接收父组件传来的数据:

// Child2.jsx export default function Child2(props) { return ( <div> <h3>子组件3.2 -- {props.msg}</h3> {/* 展示兄传来的数据 */} </div> ) }

发送前:

发送后:

如此这般,子组件3.2就成功接收到了子组件3.1的传递信息。

四、跨组件通信:「Context 全局广播」

如果组件嵌套了好多层(比如父→子→孙→重孙),一层层传功太麻烦了!这时候用Context就像「武林广播」:父组件把数据广播出去,所有后代组件都能直接收到。

广播步骤:

  1. 父组件建广播台:用createContext创建上下文对象,用 Provider
    广播数据
  2. 后代组件收广播:用useContext
    接收广播的内容

还是代码:

父组件建广播台,广播「父组件的数据」:

// 父组件 Parent.jsx import Child1 from "./Child1"; import { createContext } from 'react'; // 创建上下文对象(广播台) export const Context = createContext() export default function Parent() { return ( <div> <h2>父组件四</h2> {/* 用 Provider 广播数据,value 是要传的内容 */} <Context.Provider value={'父组件的数据'}> <Child1/> </Context.Provider> </div> ); }

孙组件直接收广播(不用经过子组件):

// 孙组件 Child2.jsx import { useContext } from 'react' import { Context } from './Parent' // 引入广播台 export default function Child2() { const msg = useContext(Context) // 直接接收广播内容 return ( <div> <h4>孙子组件 --- {msg}</h4> {/* 展示广播的内容 */} </div> ); }

另外附上子组件代码:

import Child2 from "./Child2" export default function Child1() { return ( <div> <h3>子组件</h3> <Child2/> </div> ); }

结果孙子组件成功得到父组件的数据:

五、温馨提示

别忘了App.jsxmain.jsx文件!前面的所有结果都需要这两个大佬的支持。

// App.jsx // import Parent from "./demo1/Parent" // import Parent from "./demo2/Parent" // import Parent from "./demo3/Parent" import Parent from "./demo4/Parent" export default function App() { return ( <Parent></Parent> ) }

// main.jsx import { createRoot } from 'react-dom/client' import App from './App.jsx' createRoot(document.getElementById('root')).render( <App /> )

这两份是创建React自带的,但是还是提醒一下大家别忘了!

六、总结:组件通讯「武功谱」

通讯场景方法核心思路
父子组件props 传值父传子,子只读
子父组件props 传函数父给函数,子调用传数据
兄弟组件父组件中转子→父→另一个子
跨组件Context(上下文)父广播,后代直接收

结语

其实
React 组件通讯的核心,从来都不是死记硬背步骤,而是找准数据的流向。父子传值用props单向传递,子父传值借函数反向搭桥,兄弟组件靠父组件当 “中转站”,跨层级通信就用Context打破嵌套壁垒。

这些方法没有优劣之分,只有场景之别。新手阶段先把props和函数传值练熟,再逐步尝试Context,甚至后续学习的
Redux 等状态管理库,都是在这个基础上的延伸。

记住:

组件通讯本质,就是让数据在合适的组件间有序流动。现在就打开编辑器,把这些例子敲一遍,你会发现,那些曾经让你头疼的传值问题,早就迎刃而解了。

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

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

相关文章

如何快速为OBS直播添加专业级VST音频效果:终极完整指南

如何快速为OBS直播添加专业级VST音频效果&#xff1a;终极完整指南 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst 你是否经常为直播中的音频问题而烦恼&#xff1f;背景噪音干扰、人声不够清晰、音质平平无奇……

tensorflow 零基础吃透:tf.sparse.SparseTensor 与核心 TensorFlow API 的协同使用

零基础吃透&#xff1a;tf.sparse.SparseTensor与核心TensorFlow API的协同使用 稀疏张量&#xff08;tf.sparse.SparseTensor&#xff09;可与TensorFlow绝大多数核心API透明兼容&#xff08;无需额外转换&#xff09;&#xff0c;包括tf.keras、tf.data、tf.function、tf.tra…

入职宇树Web前端开发,30K双休有点爽

投稿&#xff1a; 第一轮技术面&#xff08;JavaScript 核心 浏览器原理 前端框架底层&#xff09; 本环节重点考察 JavaScript 语言特性、浏览器渲染机制、框架原理等深度知识&#xff0c;是社招筛选的核心门槛1.JavaScript 闭包的形成原理、应用场景与内存泄漏防范 2. Ev…

ORACLE学习笔记总结(数据库归档模式的配置)

Oracle数据库归档模式配置详解归档模式&#xff08;ARCHIVELOG&#xff09;是Oracle数据库的核心配置&#xff0c;开启后才能进行热备份和完全恢复&#xff0c;是生产环境的强制要求。简单点说归档和非归档模式是LGWR进程给写入时Online redo log files数据覆盖还是备份。归档模…

Applite:告别命令行,用图形界面轻松管理macOS软件包

还在为复杂的Homebrew命令而头疼吗&#xff1f;Applite为你带来了革命性的解决方案——这款专为macOS设计的开源图形界面工具&#xff0c;让软件包管理变得像点击鼠标一样简单。 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: …

3步搞定老旧Mac升级:OpenCore Legacy Patcher USB启动盘制作全攻略

3步搞定老旧Mac升级&#xff1a;OpenCore Legacy Patcher USB启动盘制作全攻略 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方放弃的老旧Mac设备无法体验最…

ORACLE学习笔记总结(数据库常见错误及应对措施)

一、语句失败&#xff08;Statement Failure&#xff09;定义SQL语句因语法错误、权限不足或资源限制而无法正常执行&#xff0c;是最轻微的故障类型。常见场景语法错误&#xff1a;SELEC * FROM emp;&#xff08;拼写错误&#xff09;权限不足&#xff1a;普通用户执行DROP TA…

小白进阶 “挖洞大神”:SRC 漏洞挖掘完整攻略(附工具包 + 系统学习路径)

从小白到“挖洞达人”&#xff1a;SRC漏洞挖掘全流程实战指南&#xff08;附学习路线和工具&#xff09; 为什么说SRC挖洞是安全新手的最佳起点&#xff1f; 凌晨两点&#xff0c;大学生张三盯着电脑屏幕突然跳出的「高危漏洞奖励到账」提示&#xff0c;手抖得差点打翻泡面—…

tensorflow 零基础吃透:TensorFlow 张量切片与数据插入(附目标检测 / NLP 实战场景)

零基础吃透&#xff1a;TensorFlow张量切片与数据插入&#xff08;附目标检测/NLP实战场景&#xff09; 张量切片&#xff08;提取子部分&#xff09;和数据插入是TensorFlow处理结构化数据的核心操作&#xff0c;广泛用于目标检测&#xff08;特征路由、选框特征提取&#xff…

WebPlotDigitizer:科研图表数据提取的终极完整指南

WebPlotDigitizer&#xff1a;科研图表数据提取的终极完整指南 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/web/WebPlotDigitizer 还在为论文图表中的数据…

ThinkPad双风扇终极静音指南:TPFanCtrl2完整配置与优化

ThinkPad双风扇终极静音指南&#xff1a;TPFanCtrl2完整配置与优化 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在为ThinkPad笔记本的持续风扇噪音而烦恼吗&#…

微信网页版终极解决方案:wechat-need-web插件一键突破访问限制

微信网页版终极解决方案&#xff1a;wechat-need-web插件一键突破访问限制 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版频繁出现的…

C++ HTTP/2架构深度解析:从连接瓶颈到性能翻倍

你是否曾困惑&#xff0c;为什么现代Web应用在高并发场景下依然面临性能瓶颈&#xff1f;当传统HTTP/1.1的队头阻塞问题限制了系统吞吐量&#xff0c;C开发者该如何突破这一技术困境&#xff1f;本文将带你深入探索HTTP/2在C中的实现原理与性能优化策略。 【免费下载链接】cpp-…

[特殊字符]️ 羽毛球检测数据集介绍-1686张图片 运动赛事分析 智能健身设备 自动裁判系统 体育视频内容分析 机器人运动训练

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

Qwen3-32B实测:单卡A100跑出180+吞吐

Qwen3-32B实测&#xff1a;单卡A100跑出180吞吐 你有没有被这样的AI部署难题困扰过&#xff1f;想上大模型&#xff0c;70B的“巨兽”一启动就要四五张A100组集群&#xff0c;电费比工资还高 &#x1f4b8;&#xff1b;而小模型呢&#xff0c;写代码总漏半句&#xff0c;推理像…

BetterNCM终极个性化定制:从零打造专属网易云音乐深度改造方案

BetterNCM终极个性化定制&#xff1a;从零打造专属网易云音乐深度改造方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要彻底告别千篇一律的音乐播放器界面吗&#xff1f;Better…

车辆轮胎寿命预测检测数据集介绍-410张图片 车辆安全检测 车队管理和维护 智能汽车与ADAS系统 轮胎生产质量控制 道路交通监管 二手车评估与交易

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

Wallpaper_Engine终极指南:快速免费获取创意工坊壁纸的完整方案

Wallpaper_Engine终极指南&#xff1a;快速免费获取创意工坊壁纸的完整方案 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 还在为找不到精美动态壁纸而烦恼吗&#xff1f;Wallpaper_Engin…

显卡驱动彻底清理终极指南:高效解决驱动冲突问题

显卡驱动彻底清理终极指南&#xff1a;高效解决驱动冲突问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …

ComfyUI-Manager完整教程:5步掌握AI绘画插件高效管理

ComfyUI-Manager完整教程&#xff1a;5步掌握AI绘画插件高效管理 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager ComfyUI-Manager是专为ComfyUI设计的智能插件管理工具&#xff0c;它彻底解决了插件安装、更新和管理的…