React 中组件通信的几种主要方式
一、父传子:
1. 传递多个属性
父组件可以通过 props 传递多个属性给子组件。
示例
// 子组件
function Son(props) {return (<div>This is Son, {props.name} - Age: {props.age}</div>);
}// 父组件
function App() {const name = 'This is App Name';const age = 10;return (<div><Son name={name} age={age} /></div>);
}
2. 传递函数作为 props
父组件可以将函数作为 props 传递给子组件,子组件可以调用这个函数来与父组件进行交互。
示例
// 子组件
function Son(props) {const handleClick = () => {props.onButtonClick('Button clicked!');};return (<div>This is Son. <button onClick={handleClick}>Click Me</button></div>);
}// 父组件
function App() {const handleSonClick = (message) => {console.log(message);};return (<div><Son onButtonClick={handleSonClick} /></div>);
}
3. 使用默认值
为子组件的 props 设置默认值,使用 defaultProps。
示例
// 子组件
function Son(props) {return <div>This is Son, {props.name}</div>;
}Son.defaultProps = {name: 'Default Name'
};// 父组件
function App() {return (<div><Son /> {/* 不传递 name 属性 */}</div>);
}
4. PropTypes 验证
使用 prop-types 库可以对传递给子组件的 props 进行类型检查。
示例
import PropTypes from 'prop-types';// 子组件
function Son(props) {return <div>This is Son, {props.name}</div>;
}Son.propTypes = {name: PropTypes.string.isRequired, // name 是必需的字符串
};// 父组件
function App() {return (<div><Son name="This is App Name" /></div>);
}
5. 传递对象和数组
父组件可以传递对象或数组作为 props,子组件可以直接使用。
示例:
子组件向父组件传递数据的主要方式是通过回调函数。父组件将一个函数作为 props 传递给子组件,子组件在需要时调用这个函数,并将数据作为参数传递给父组件。
// 子组件
function Son(props) {return (<div>This is Son, {props.data.name}, Age: {props.data.age}</div>);
}// 父组件
function App() {const user = { name: 'John', age: 25 };return (<div><Son data={user} /></div>);
}
总结:
- 多属性传递: 父组件可以传递多个属性给子组件。
- 函数作为 props: 父组件可以将函数传递给子组件,子组件可以调用这个函数与父组件进行交互。
- 默认值和类型检查: 可以通过
defaultProps和PropTypes来确保 props 的完整性和正确性。 - 传递对象和数组: 可以将复杂的数据结构(如对象和数组)作为 props 传递。
二、子传父:
子组件向父组件传递数据的主要方式是通过回调函数。父组件将一个函数作为 props 传递给子组件,子组件在需要时调用这个函数,并将数据作为参数传递给父组件。

1.基本用法示例:
父组件
import React from 'react';
import Son from './Son';function App() {const handleMessage = (msg) => {console.log("Received from Son:", msg);};return (<div><h1>Parent Component</h1><Son onSendMessage={handleMessage} /></div>);
}export default App;
子组件
import React from 'react';function Son(props) {const sendMessage = () => {props.onSendMessage("Hello from Son!");};return (<div><h2>Child Component</h2><button onClick={sendMessage}>Send Message to Parent</button></div>);
}export default Son;
2. 传递事件数据
子组件可以传递事件数据给父组件,通常用于处理用户输入或按钮点击。
示例
// 父组件
function App() {const handleInputChange = (inputValue) => {console.log("Input from Son:", inputValue);};return (<div><h1>Parent Component</h1><Son onInputChange={handleInputChange} /></div>);
}// 子组件
function Son(props) {const handleChange = (event) => {props.onInputChange(event.target.value);};return (<div><h2>Child Component</h2><input type="text" onChange={handleChange} placeholder="Type something..." /></div>);
}
3. 传递多个参数
子组件也可以通过回调函数传递多个参数给父组件。
示例
// 父组件
function App() {const handleData = (name, age) => {console.log("Received from Son:", name, age);};return (<div><h1>Parent Component</h1><Son onSendData={handleData} /></div>);
}// 子组件
function Son(props) {const sendData = () => {props.onSendData("John", 30);};return (<div><h2>Child Component</h2><button onClick={sendData}>Send Data to Parent</button></div>);
}
总结:
- 回调函数: 子组件通过调用父组件传递的回调函数来传递数据。
- 事件数据传递: 子组件可以通过回调函数向父组件传递事件数据,如用户输入。
- 多个参数: 子组件可以通过回调函数传递多个参数给父组件。
三、使用Context机制跨层级组件通信:
App组件——A组件——B组件

1.创建上下文对象:在所有组件外部创建一个上下文对象
import React, { createContext } from 'react';// 创建上下文对象
cosnt MsgContext = createContext()
2.顶层组件提供数据:在顶层组件通过Provider组件提供数据
// App.js
import React, { useState } from 'react';
import MyContext from './MyContext';
import ComponentA from './ComponentA';const App = () => {const [data, setValue] = useState("Hello from Context!");return (<MyContext.Provider value={{ data, setData }}><h1>Top Level Component</h1><A /></MyContext.Provider>);
};export default App;
3.中间组件A组件(可选)
// ComponentA.js
import React from 'react';
import ComponentB from './ComponentB';const ComponentA = () => {return (<div><h2>Component A</h2><B /></div>);
};export default ComponentA;
4.底层组件消费数据: 在底层组件中使用 useContext 钩子获取数据。
// ComponentB.js
import React, { useContext } from 'react';
import MyContext from './MyContext';const ComponentB = () => {const { value, setValue } = useContext(MyContext); // 获取上下文const changeValue = () => {setValue('update from B'); // 更新上下文值};return (<div><h3>Component B</h3><p>Data from Context: {data}</p><button onClick={changeValue}>更新值</button></div>);
};export default ComponentB;
总结:
- 创建 Context: 使用
createContext创建上下文。 - 提供 Context: 使用
Context.Provider在顶层组件中提供数据。 - 使用 Context: 在子组件中使用
useContext钩子访问上下文。 - 更新 Context: 子组件通过调用更新函数来修改上下文的值。
相关文章:
React 中组件通信的几种主要方式
一、父传子: 1. 传递多个属性 父组件可以通过 props 传递多个属性给子组件。 示例 // 子组件 function Son(props) {return (<div>This is Son, {props.name} - Age: {props.age}</div>); }// 父组件 function App() {const name This is App N…...
mint-ui Picker 显示异常
mint-ui Picker 显示异常 现象 最近一个老项目页面显示异常,使用mint-ui Picker显示异常,直接显示成了 数据对象,而不是具体travelName 字段 组件 mint-ui Picker 使用方式(vue方式) // template <mt-picker :slots"slots" value-key…...
深入理解 MySQL 中的日志类型及其应用场景
目录标题 MySQL 中的日志类型这么多,它们都有哪些作用?1.错误日志(Error Log)2.事务日志2.1 InnoDB Redo Log(重做日志)2.2 InnoDB Undo Log (撤消日志)3.查询日志(General Query Log)4.慢查询日志 (Slow Query Log)5.二进制日志(Binary Log)6.中继日志 (Relay Log)总结一下M…...
群控系统服务端开发模式-应用开发-上传配置功能开发
下面直接进入上传配置功能开发,废话不多说。 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_upload (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,upload_type tinyint(1) UNSIGNED NOT NULL COMMENT 上传类型 1:本站 2&a…...
stm32——GPIO开发
目录 1、什么是GPIO 2、GPIO的作用 3、GPIO的基本结构 4、GPIO引脚的基本结构 5、GPIO端口模式的配置 1. 输入浮空(Input Floating) 2. 输入上拉(Input Pull-Up) 3. 输入下拉(Input Pull-Down) 4. …...
layui 自定义验证单选框必填
对于输入框类型必填验证,只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢?layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…...
Spring 设计模式之策略模式
Spring 设计模式之策略模式 策略模式构成部分java举例 策略模式 策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。 构成部分 Context(上下文&…...
苹果开发 IOS 证书生成步骤
前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后,就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心,创建 profiles 文件,并下载以上步骤即可,就这…...
DDR2 SDRAM(五)初始化
因为DDR2本质上只是更高级的一种SRAM,底层操作原理和SRAM是一样的,所以很多基础的东西就不再赘述了。 一、原理 在初始化之前,DDR2芯片需要先上电,芯片有多个需要提供的电压,其大小和顺序也有要求,这部分…...
Python工具箱系列(五十七)
图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下&#x…...
数据智能驱动金融策略优化:民锋智能分析技术的应用
在现代金融市场中,数据分析与智能化技术的结合为投资策略带来了全新机遇。民锋以智能分析技术为核心,帮助投资者在复杂的市场环境中做出高效决策。本文将深入探讨民锋智能分析技术如何驱动策略优化,为投资者带来更加智能化的支持。 #### 一、…...
1009:带余除法
【题目描述】 给定被除数和除数,求整数商及余数。此题中请使用默认的整除和取余运算,无需对结果进行任何特殊处理。 【输入】 一行,包含两个整数,依次为被除数和除数(除数非零),中间用一个空格隔…...
Jmeter实际应用
环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点,不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码,是要在jmeter中用的 keytool -import -ali…...
C++基础(11.AVL树的实现)
目录 AVL的概念: AVL树的实现: AVL树的结构: AVL树的插⼊: 平衡因⼦更新: 旋转: AVL树的其他功能: AVL树平衡检测: 测试代码*2: 源代码: KV结构: 源代码: AVL…...
c# 抽象方法 虚函数 使用场景
在C#中,抽象方法(abstract method)和虚函数(virtual method)都是用于实现多态性(polymorphism)的重要特性,但它们在使用上有一些关键的区别和各自的用途。 抽象方法(Abs…...
大数据安全方案 验证
一、背景 文档用于记录配置 Kerberos 和 Ranger 后,对 HDFS、Hive 认证和鉴权的功能测试。 二、Kerberos 验证 2.1、验证功能 1,HDFS 认证 2.1.1、访问 HDFS Kerberos 验证前,访问 HDFS 失败。 Kerberos 验证后,访问 HDFS 成…...
电脑软件:推荐一款免费且实用的电脑开关机小工具
目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown,有需要的朋友可以下载试一下! 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具,对于…...
php反序列化靶场随笔分析
项目地址:github.com/mcc0624/php_ser_Class 推荐使用docker部署:https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础,我们直接从class6开始实验 class6 访问页面,传一个序列化的字符串,php代码将其反…...
动态规划 - 编辑距离
115. 不同的子序列 困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 7 取模。 算法思想:利用动态规划,分s[i - 1] 与 t[j - 1]相等,s[i - 1] 与 t[j - 1] 不相等两种情况具…...
力扣——113. 路径总和
113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

