react【详解】组件 (含父子组件传值、兄弟组件传值、越层组件传值、“插槽“,高阶组件等)
什么是组件一个组件就是用户界面的一部分它可以有自己的逻辑和外观。组件之间可以互相嵌套也可以复用多次为什么要用组件组件能让开发者像搭积木一样快速构建一个完整的庞大应用大大提升了开发效率降低了维护成本因此当下前端的主流开发模式即组件化开发定义组件react 中的组件有以下特征是一个首字母大写的函数函数的返回值是一段 JSX 代码用于渲染页面通常每个组件都用独立的.jsx文件描述并用export default对外导出return 返回的语句写在一行则可以省略() 但只要不在一行就必须要 () 所以建议总是加上 ()returnimg srchttps://i.imgur.com/MK3eW3As.jpgaltKatherine Johnson/;范例 Demo.jsxfunctionDemo(){returndiv你好/div;}exportdefaultDemo;也可以写成箭头函数constDemo(){returndiv你好/div;};exportdefaultDemo;高阶组件 HOC注意现代更主流的做法是使用 HOOK 来实现代码复用而不是使用 HOC但仍需会 HOC 因为老项目中是 HOC若一个组件的参数是组件返回值是一个新组件则它就是一个高阶组件。高阶组件HOC, Higher-Order Component的核心作用是复用逻辑和增强组件功能。通常约定以小写字母开头【实战范例】汉堡套餐HOC// 汉堡套餐生成器constwithCombo(Food){return(props)(div{/* 汉堡本尊 */}Food{...props}/{/* 自动附赠的薯条和可乐 */}Fries/Coke//div)}使用// 传入双层芝士汉堡得到双层芝士汉堡套餐含薯条和可乐constDoubleCheeseBurgerWithCombowithCombo(DoubleCheeseBurger)【实战范例】权限控制HOCfunctionwithAuth(WrappedComponent,requiredRoleuser){returnfunctionAuthWrapper(props){const{user}useAuth();// 假设使用自定义Hook获取用户// 检查是否已登录if(!user){returnRedirect to/login/;}// 检查是否有权限if(requiredRoleadminuser.role!admin){returnUnauthorized message需要管理员权限/;}// 有权限则正常渲染returnWrappedComponent{...props}user{user}/;};}// 使用constAdminPanelwithAuth(AdminPanelBase,admin);constUserProfilewithAuth(UserProfileBase,user);使用组件以在 App.jsx 中使用为例先导入importDemofrom./Demo.js;再使用functionApp(){return(Demo//);}可以单标签自闭也可以像 html 一样双标签配对Demo/Demo组件通信即组件间相互传递数据父组件传值给子组件Avatar person{{name:Lin Lanying,imageId:1bX5QH6}}size{100}/或letme{name:朝阳,age:18,};Persion{...me}/此种写法要留意顺序Persion{...me}age{36}/此时 age 最终值为 36后方的属性会覆盖前方的属性父组件给子组件传递 JSX 内容插槽 children使用子组件时其标签内的内容即插槽在子组件中可通过 children 获取到父组件importChildfrom./child.jsx;functionFather(){return(Child你好/Child/);}exportdefaultFather;子组件functionChild({children}){return(h1我是子组件/h1div父组件传入的插槽内容为{children}/div/);}exportdefaultChild;具名插槽https://blog.csdn.net/weixin_41192489/article/details/139835331动态插槽https://blog.csdn.net/weixin_41192489/article/details/157583866父组件调用子组件的方法useImperativeHandle 暴露子组件的方法forwardRef 暴露子组件React19 中 forwardRef 不再必须可以直接把 ref 当普通 props 传递不使用 forwardRef// React19新写法不再需要forwardRef包裹Child ref{childRef}/functionChild({ref}){constinneruseRef(null)useImperativeHandle(ref,()({...}))returninput ref{inner}/}使用 forwardRefimport React,{useRef,useImperativeHandle,forwardRef}fromreact;// 子组件函数组件constChildComponentforwardRef((props,ref){constinnerRefuseRef(null);// 定义暴露给父组件的方法useImperativeHandle(ref,()({focus:(){innerRef.current.focus();},showMessage:(){console.log(这是子组件的方法);}}));returninput ref{innerRef}typetext/;});// 父组件functionParentComponent(){constchildRefuseRef(null);consthandleClick(){// 调用子组件的方法childRef.current.showMessage();childRef.current.focus();};return(divbutton onClick{handleClick}调用子组件方法/buttonChildComponent ref{childRef}//div);}父组件获取子组件的DomforwardRef 暴露子组件父组件中通过 ref 属性将定义的 inputRef 传给子组件子组件通过第二个参数 prop_ref 获取到父组件传入的 inputRef子组件的目标元素通过 ref 属性绑定 prop_ref父组件constinputRefuseRefTextInput(null);useEffect((){inputRef.current?.focus();// 通过 ref 调用 focus 方法},[]);Test ref{inputRef}/子组件import{forwardRef}fromreact;import{TextInput,View}fromreact-native;// eslint-disable-next-line react/display-nameexportdefaultforwardRefTextInput((props,prop_ref){return(ViewTextInput ref{prop_ref}//View);});子组件获取父组件的传值 propsfunctionAvatar({person,size}){// 直接访问 person 和 size 即可}或functionAvatar(props){letpersonprops.person;letsizeprops.size;}指定 props 的默认值functionAvatar({person,size100}){}或Avatar.defaultProps{size:100,};给 props 添加类型校验 propTypesPropTypes是React提供的一个用于类型检查的库。它可以用来验证组件的属性props是否符合预期的类型和格式importPropTypesfromprop-types;写在组件函数外Avatar.propTypes{person:PropTypes.object,size:PropTypes.number,};添加必填校验 .isRequired在末尾添加 .isRequiredAvatar.propTypes{person:PropTypes.object.isRequired,size:PropTypes.number,};数据类型检查器PropTypes.stringPropTypes.symbolPropTypes.numberPropTypes.bigintPropTypes.boolPropTypes.funcPropTypes.arrayPropTypes.object节点类型检查器PropTypes.nodePropTypes.elementPropTypes.elementType子组件传值给父组件实现方案在子组件中调用父组件传给子组件的函数参数为要传递的值注意使用可选链运算符?.来确保安全避免因传入的方法不存在而报错。functionPersion({name,age,handleAgeChange}){return(h1你好{name}/h1p你今年{age}岁。/p{/* 可选链运算符 ?.允许在访问对象的属性或调用对象的方法时不必先检查该对象是否存在 */}button onClick{()handleAgeChange?.(36)}更新年龄为36/button/);}functionApp(){// 使用 useState 钩子管理状态确保状态更新时组件会重新渲染const[me,setMe]useState({name:朝阳,age:18,});consthandleAgeChange(newAge){// 使用 setMe 函数更新状态而不是直接修改对象setMe(prevState({...prevState,age:newAge}));};return(Persion{...me}handleAgeChange{(newAge){/* 触发父组件状态更新 */handleAgeChange(newAge);}}//);}子组件调用父组件的方法实现方案在子组件中调用父组件传给子组件的函数父组件import{useState}fromreact;importChildfrom./child.jsx;functionFather(){const[name,setName]useState(朝阳);functionchangeName(){setName(新的朝阳);}return(h1我是父组件/h1p父组件中的变量 name 的值为{name}/pChild changeName{changeName}/Child/);}exportdefaultFather;子组件importPropTypesfromprop-types;functionChild({changeName}){return(h1我是子组件/h1button onClick{changeName}修改父组件的名字为“新的朝阳”/button/);}Child.propTypes{changeName:PropTypes.func,};exportdefaultChild;兄弟组件通信father.jsximport{useState}fromreact;importChildAfrom./childA.jsx;importChildBfrom./childB.jsx;functionFather(){const[msgA,setMsgA]useState();functionsendMsgToB(msg){setMsgA(msg);}return(ChildA sendMsgToB{sendMsgToB}/ChildB msgA{msgA}//);}exportdefaultFather;childA.jsximportPropTypesfromprop-types;functionChildA({sendMsgToB}){constdataA子组件A的数据;return(divh1我是子组件A/h1button onClick{()sendMsgToB(dataA)}向子组件B传递数据/button/div/);}ChildA.propTypes{sendMsgToB:PropTypes.func,};exportdefaultChildA;childB.jsximportPropTypesfromprop-types;functionChildB({msgA}){return(divh1我是子组件B/h1p子组件A传来的数据为{msgA}/p/div/);}ChildB.propTypes{msgA:PropTypes.string,};exportdefaultChildB;跨层组件通信详见 https://blog.csdn.net/weixin_41192489/article/details/138700487

相关新闻

Qucs-S传输线计算实战:告别阻抗失配与信号反射的完整工作流

Qucs-S传输线计算实战:告别阻抗失配与信号反射的完整工作流

Qucs-S传输线计算实战:告别阻抗失配与信号反射的完整工作流 【免费下载链接】qucs_s Qucs-S is a circuit simulation program with Qt-based GUI 项目地址: https://gitcode.com/gh_mirrors/qu/qucs_s 深夜两点,你刚把一块高速板送去打样&#x…

2026/10/9 0:20:10 阅读更多 →
网盘直链下载工具免费开源完整指南:8大网盘真实下载地址一键获取

网盘直链下载工具免费开源完整指南:8大网盘真实下载地址一键获取

网盘直链下载工具免费开源完整指南:8大网盘真实下载地址一键获取 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…

2026/10/9 9:09:38 阅读更多 →
react19【系列实用教程】useEffect —— 副作用操作

react19【系列实用教程】useEffect —— 副作用操作

什么是副作用操作?在程序中,副作用指的是 一个函数除了返回值之外,还做了其他事情。 👉 纯函数(pure function):同样的输入 → 永远返回同样的输出,不会影响外部世界 👉 …

2026/10/10 5:05:24 阅读更多 →

最新新闻

VaR五种算法R实现:从历史模拟到Copula-GARCH全解析

VaR五种算法R实现:从历史模拟到Copula-GARCH全解析

简介:金融风险管理中,风险价值(VaR)是衡量投资组合潜在损失的核心指标。这份资料聚焦五种计算VaR的算法,重点利用DCC-GARCH模型与Copula-GARCH模型进行波动率与相依性建模,面向金融工程、量化风控方向的学生…

2026/10/12 22:30:07 阅读更多 →
Linux 上自建 Nacos 集群:从环境准备到高可用验证的完整指南

Linux 上自建 Nacos 集群:从环境准备到高可用验证的完整指南

1. 为什么要在 Linux 上自建 Nacos 集群1.1 从单机到集群:一个绕不开的坎很多团队一开始用 Nacos 都是单机模式,图省事,下载解压启动就完事。开发环境跑得好好的,一到预发或者生产环境,问题就来了:服务注册…

2026/10/12 22:30:07 阅读更多 →
Docker 安装 Jenkins 实战:从环境部署到自动化构建与部署全流程

Docker 安装 Jenkins 实战:从环境部署到自动化构建与部署全流程

最近这段时间一直在折腾持续集成这套东西,起因也很简单:某次发布新版本的时候,我手动打包、传服务器、重启服务,一步接一步,结果到了最后才发现漏了一个配置文件,整个流程又得从头来一遍。那天晚上我就在想…

2026/10/12 22:30:07 阅读更多 →
35kV三段式电流继电保护课程设计:整定计算与仿真全流程

35kV三段式电流继电保护课程设计:整定计算与仿真全流程

“35kV电力系统三段式电流继电保护课程设计仿真报告”,这句话我琢磨了好一阵子。电气专业的学生对这个题目应该都不陌生,它几乎是继电保护课程里绕不开的经典任务。很多人拿到这个题目之后的第一反应不是“我会不会算”,而是“我算这些东西到…

2026/10/12 22:30:07 阅读更多 →
豆瓣评论情感分析与词云实战:SnowNLP 中文 NLP 流水线

豆瓣评论情感分析与词云实战:SnowNLP 中文 NLP 流水线

简介:这份资源面向Python数据挖掘初学者与自然语言处理入门者,围绕豆瓣《肖申克的救赎》评论文本,演示如何调用SnowNLP库完成情感分析,并配合词云与分词处理,帮助读者建立从文本读取、中文分词到情感倾向判定的完整思路…

2026/10/12 22:30:07 阅读更多 →
flannel-v0.11.0 ARM64二进制包:Kubernetes边缘节点CNI确定性部署方案

flannel-v0.11.0 ARM64二进制包:Kubernetes边缘节点CNI确定性部署方案

简介:本资源为 Kubernetes 容器网络插件 Flannel 的 v0.11.0 版本官方二进制发行包,专为 ARM64 架构 Linux 系统编译,适用于在树莓派、国产 ARM 服务器或边缘计算节点上部署 K8s 集群的运维工程师与云原生开发者。压缩包共含 3 个核心文件&am…

2026/10/12 22:29:07 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →