【React】详解组件通信:从基础到进阶的全面指南
文章目录
- 一、父组件向子组件传递数据
- 1. 基本概念
- 2. 示例代码
- 3. 详解
- 定义子组件 `Son`
- 定义父组件 `App`
- 导出父组件 `App`
- 数据流
- `props` 的内容
- 二、子组件向父组件传递数据
- 1. 基本概念
- 2. 示例代码
- 3. 详解
- 引入React库和useState钩子
- 定义子组件 `Son`
- 定义父组件 `App`
- 导出父组件 `App`
- 数据流
- 三、兄弟组件之间的通信
- 1. 基本概念
- 2. 示例代码
- 3. 详解
- 四、跨层级组件之间的通信
- 1. 基本概念
- 2. 创建上下文
- 3. 详解
在React开发中,组件之间的通信是一个重要且常见的需求。无论是父组件向子组件传递数据,还是子组件向父组件发送消息,理解和掌握这些通信方式都是编写高效和可维护代码的关键。本文将详细介绍React中组件通信的各种方法,包括基础的父传子、子传父,及进阶的跨层级组件通信。通过本文,你将全面了解如何在React中实现高效的组件通信。
一、父组件向子组件传递数据
1. 基本概念
父组件向子组件传递数据是React中最常见的通信方式。父组件通过在子组件标签上绑定属性,将数据作为 props 传递给子组件。
2. 示例代码
import React from 'react';function Son(props) {// props:对象里面包含了父组件传递过来的所有的数据// { name: '父组件中的数据', age: 18, ... }console.log(props);return <div>this is son, {props.name}, jsx: {props.child}</div>;
}function App() {const name = 'this is app name';return (<div><Sonname={name}age={18}isTrue={false}list={['vue', 'react']}obj={{ name: 'jack' }}cb={() => console.log(123)}child={<span>this is span</span>}/></div>);
}export default App;
3. 详解
定义子组件 Son
function Son(props) {// props:对象里面包含了父组件传递过来的所有的数据// { name: '父组件中的数据', age: 18, ... }console.log(props);return <div>this is son, {props.name}, jsx: {props.child}</div>;
}
解释:
Son是一个函数组件,它接收一个参数props。props是一个对象,包含了父组件传递给子组件的所有数据。- 在函数体内,通过
console.log(props)可以看到props的内容,其中包括多个属性。 return语句返回了一段 JSX,表示子组件的 UI 结构。this is son是静态文本。{props.name}是从props中提取的name属性,显示传递过来的名字。{props.child}是从props中提取的child属性,这里传递的是一个 JSX 元素<span>。
定义父组件 App
function App() {const name = 'this is app name';return (<div><Sonname={name}age={18}isTrue={false}list={['vue', 'react']}obj={{ name: 'jack' }}cb={() => console.log(123)}child={<span>this is span</span>}/></div>);
}
解释:
App是一个函数组件,它定义了一个变量name,其值为'this is app name'。- 在
return语句中,返回了一段包含子组件Son的 JSX。 - 父组件通过在子组件标签上添加属性,将数据传递给子组件:
name={name}传递字符串'this is app name'。age={18}传递数字18。isTrue={false}传递布尔值false。list={['vue', 'react']}传递数组['vue', 'react']。obj={{ name: 'jack' }}传递对象{ name: 'jack' }。cb={() => console.log(123)}传递函数() => console.log(123)。child={<span>this is span</span>}传递 JSX 元素<span>this is span</span>。
导出父组件 App
export default App;
解释:
- 使用
export default App;将App组件作为默认导出,以便在其他文件中导入并使用它。
数据流
在这个例子中,数据流是单向的,即从父组件 App 传递到子组件 Son。父组件通过 props 向子组件传递数据,子组件通过 props 对象接收这些数据并进行渲染。
props 的内容
当 Son 组件被渲染时,props 对象包含如下属性:
{"name": "this is app name","age": 18,"isTrue": false,"list": ["vue", "react"],"obj": { "name": "jack" },"cb": function() { console.log(123); },"child": <span>this is span</span>
}
这些属性可以在 Son 组件中通过 props 进行访问和使用。例如:
props.name将返回'this is app name'。props.age将返回18。props.isTrue将返回false。props.list将返回['vue', 'react']。props.obj将返回{ name: 'jack' }。props.cb将返回() => console.log(123)。props.child将返回<span>this is span</span>。
通过这种方式,父组件和子组件之间实现了数据的传递和共享,使得组件间的通信变得简单和直观。
二、子组件向父组件传递数据
1. 基本概念
子组件向父组件传递数据通常通过回调函数实现。父组件将一个回调函数作为 props 传递给子组件,子组件在需要传递数据时调用这个回调函数,并将数据作为参数传递回父组件。
2. 示例代码
import React, { useState } from 'react';function Son(props) {const handleClick = () => {props.onDataChange('子组件传递的数据');};return <button onClick={handleClick}>传递数据给父组件</button>;
}function App() {const [data, setData] = useState('');const handleDataChange = (newData) => {setData(newData);};return (<div><Son onDataChange={handleDataChange} /><p>父组件接收到的数据: {data}</p></div>);
}export default App;
3. 详解
引入React库和useState钩子
import React, { useState } from 'react';
这行代码引入了React库和 useState 钩子,使我们能够使用React的功能来定义和管理组件状态。
定义子组件 Son
function Son(props) {const handleClick = () => {props.onDataChange('子组件传递的数据');};return <button onClick={handleClick}>传递数据给父组件</button>;
}
解释:
Son是一个函数组件,它接收一个参数props。props是一个对象,包含了父组件传递给子组件的所有数据和函数。- 定义了一个
handleClick函数,当按钮被点击时,这个函数将会被调用。 - 在
handleClick函数中,通过调用props.onDataChange('子组件传递的数据'),子组件将数据'子组件传递的数据'传递给父组件。 return语句返回了一段 JSX,表示子组件的 UI 结构:一个按钮,点击该按钮时会调用handleClick函数。
定义父组件 App
function App() {const [data, setData] = useState('');const handleDataChange = (newData) => {setData(newData);};return (<div><Son onDataChange={handleDataChange} /><p>父组件接收到的数据: {data}</p></div>);
}
解释:
App是一个函数组件。- 使用
useState钩子定义了一个状态变量data,初始值为空字符串''。useState返回一个数组,包含当前状态值data和更新状态的函数setData。 - 定义了一个
handleDataChange函数,它接受一个参数newData。在这个函数中,调用setData(newData)更新状态data。 - 在
return语句中,返回了一段包含子组件Son的 JSX。- 通过
onDataChange={handleDataChange},将handleDataChange函数作为onDataChange属性传递给子组件Son。 - 包含一个段落元素
<p>,显示父组件接收到的数据data。
- 通过
导出父组件 App
export default App;
**解释:**使用 export default App; 将 App 组件作为默认导出,以便在其他文件中导入并使用它。
数据流
在这个例子中,数据流是双向的:
- 父组件向子组件传递数据:
- 父组件
App将handleDataChange函数通过onDataChange属性传递给子组件Son。
- 父组件
- 子组件向父组件传递数据:
- 子组件
Son在按钮点击时,调用props.onDataChange('子组件传递的数据'),将数据'子组件传递的数据'传递给父组件。 - 父组件的
handleDataChange函数接收数据并调用setData(newData)更新父组件的状态。 - 状态更新后,父组件重新渲染,显示最新的
data。
- 子组件
三、兄弟组件之间的通信
1. 基本概念
兄弟组件之间的通信通常需要借助于它们的共同父组件。兄弟组件通过父组件共享状态或通过回调函数实现通信。
2. 示例代码
import React, { useState } from 'react';function BrotherA(props) {const handleClick = () => {props.onDataChange('BrotherA的数据');};return <button onClick={handleClick}>传递数据给BrotherB</button>;
}function BrotherB(props) {return <p>BrotherB接收到的数据: {props.data}</p>;
}function App() {const [data, setData] = useState('');const handleDataChange = (newData) => {setData(newData);};return (<div><BrotherA onDataChange={handleDataChange} /><BrotherB data={data} /></div>);
}export default App;
3. 详解
在上面的示例中:
- 父组件
App定义了一个状态data,以及一个处理数据变化的回调函数handleDataChange。 - 兄弟组件
BrotherA和BrotherB都通过props接收父组件传递的数据或回调函数。 BrotherA通过调用回调函数props.onDataChange传递数据给父组件。- 父组件通过更新状态,将数据传递给
BrotherB,实现兄弟组件之间的通信。
四、跨层级组件之间的通信
1. 基本概念
当需要跨越多个层级的组件之间进行通信时,可以使用React的上下文(Context)API。上下文API允许你在组件树中共享数据,而不必显式地通过每一级组件传递 props。
2. 创建上下文
import React, { createContext, useContext, useState } from 'react';const MyContext = createContext();function Parent() {const [data, setData] = useState('初始数据');return (<MyContext.Provider value={{ data, setData }}><Child /></MyContext.Provider>);
}function Child() {return <Grandchild />;
}function Grandchild() {const { data, setData } = useContext(MyContext);const handleClick = () => {setData('更新后的数据');};return (<div><p>接收到的数据: {data}</p><button onClick={handleClick}>更新数据</button></div>);
}export default Parent;
3. 详解
在上面的示例中:
- 创建了一个上下文
MyContext。 - 父组件
Parent使用MyContext.Provider提供数据data和更新函数setData。 - 子组件
Child和孙组件Grandchild通过上下文共享父组件的数据和更新函数。 Grandchild使用useContext(MyContext)获取上下文数据,并通过调用setData更新数据。

相关文章:
【React】详解组件通信:从基础到进阶的全面指南
文章目录 一、父组件向子组件传递数据1. 基本概念2. 示例代码3. 详解定义子组件 Son定义父组件 App导出父组件 App数据流props 的内容 二、子组件向父组件传递数据1. 基本概念2. 示例代码3. 详解引入React库和useState钩子定义子组件 Son定义父组件 App导出父组件 App数据流 三…...
【vluhub】zabbix漏洞
介绍: zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…...
openGauss触发器详解
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操…...
抄作业-跟着《React通关秘籍》捣鼓React-playground-上集
文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…...
80后最后的书信 年代
当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片,封面要写内有照片,请勿折叠 信的开头应该是 见字如面,展信舒颜 如果拜托别人做事情,最后要写为盼 最后要写 某某草 书未尽…...
软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点
场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…...
Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
Readme 最近开始学习Unity制作2D动作游戏,由于一些操作第一次接触,为了加深印象,准备写这样一篇同步教程的笔记。 之前也接触过Unity,用 Unity 制作过一个非常简单的小游戏 Flappy Bird,并且魔改成了泰拉瑞亚的版本。…...
什么是NIO
NIO(New Input/Output),也称为Java非阻塞IO,是从Java 1.4版本开始引入的一个新的IO API,旨在提供一种比传统的阻塞IO更高效、更灵活的IO操作方式。 一 NIO用法的详细介绍 NIO支持面向缓冲区的、基于通道的IO操作&…...
PHP switch 替代品 match
match 是 PHP 8 中引入的新特性。在 PHP 8 中,match 用作新的类型安全的替代 switch 语句。它提供了更清晰、更简洁的语法,同时还支持表达式作为条件,可以更轻松地处理复杂的条件逻辑。 在 match 表达式中,每个分支都是一个条件和…...
FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言,那么我们这次分享删除留言接口的开发…...
面试重点---快速排序
快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…...
[MIT6.5840]MapReduce
MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲,MapReduce是一种分布式框架,可以用来处理…...
【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )
文章目录 一、校验码1、校验码由来2、奇偶校验码3、CRC 循环冗余码 ( 重点考点 )4、海明码校验 ( 软考不经常考到 ) 二、CRC 循环冗余码 ( 重点考点 )1、模 2 除法概念2、模 2 除法步骤3、模 2 除法示例4、CRC 循环冗余码示例 15、CRC 循环冗余码示例 2 参考之前的博客 : 【计…...
springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上
springboot,service 层统一异常抛出时,throws Exception写在实现接口上,不是直接写在实现类上...
深度学习高效性网络
为了减轻Transformer笨重的计算成本,一系列工作重点开发了高效的Vision Transformer,如Swin Transformer、PVT、Twins、CoAtNet和MobileViT。 1、字节TRT-ViT 兼具CNN的速度、Transformer精度的模型 TRT-ViT(Transformer-based Vision Tra…...
PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
Solution:打开cmd输入指令下载malplotlib pip install matplotlib...
Flutter Geolocator插件使用指南:获取和监听地理位置
Flutter Geolocator插件使用指南:获取和监听地理位置 简介 geolocator 是一个Flutter插件,提供了一个简单易用的API来访问特定平台的地理位置服务。它支持获取设备的最后已知位置、当前位置、连续位置更新、检查设备上是否启用了位置服务,以…...
网站基本布局CSS
代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title></title><style type"text/css">body {margi…...
ssm框架整合,异常处理器和拦截器(纯注解开发)
目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…...
古籍双层PDF制作教程:保姆级古籍数字化教程
在智慧古籍数字化项目中,很多图书馆要求将古籍导出为双层PDF,并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台,3分钟把一个古籍书籍转化为双侧PDF。 第1步:上传古籍 点批量上传…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
