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

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: 父组件可以将函数传递给子组件,子组件可以调用这个函数与父组件进行交互。
  • 默认值和类型检查: 可以通过 defaultPropsPropTypes 来确保 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 中组件通信的几种主要方式

一、父传子&#xff1a; 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 显示异常 现象 最近一个老项目页面显示异常&#xff0c;使用mint-ui Picker显示异常,直接显示成了 数据对象&#xff0c;而不是具体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…...

群控系统服务端开发模式-应用开发-上传配置功能开发

下面直接进入上传配置功能开发&#xff0c;废话不多说。 一、创建表 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&#xff1a;本站 2&a…...

stm32——GPIO开发

目录 1、什么是GPIO 2、GPIO的作用 3、GPIO的基本结构 4、GPIO引脚的基本结构 5、GPIO端口模式的配置 1. 输入浮空&#xff08;Input Floating&#xff09; 2. 输入上拉&#xff08;Input Pull-Up&#xff09; 3. 输入下拉&#xff08;Input Pull-Down&#xff09; 4. …...

layui 自定义验证单选框必填

对于输入框类型必填验证&#xff0c;只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢&#xff1f;layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…...

Spring 设计模式之策略模式

Spring 设计模式之策略模式 策略模式构成部分java举例 策略模式 策略模式&#xff1a;允许定义一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;且算法的变化可以独立于使用它们的客户端。 构成部分 Context&#xff08;上下文&…...

苹果开发 IOS 证书生成步骤

前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后&#xff0c;就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心&#xff0c;创建 profiles 文件&#xff0c;并下载以上步骤即可&#xff0c;就这…...

DDR2 SDRAM(五)初始化

因为DDR2本质上只是更高级的一种SRAM&#xff0c;底层操作原理和SRAM是一样的&#xff0c;所以很多基础的东西就不再赘述了。 一、原理 在初始化之前&#xff0c;DDR2芯片需要先上电&#xff0c;芯片有多个需要提供的电压&#xff0c;其大小和顺序也有要求&#xff0c;这部分…...

Python工具箱系列(五十七)

图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的&#xff0c;图像分割作为计算机视觉的基础&#xff0c;对具有现有目标和较精确边界的图像进行分割&#xff0c;实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类&#xff0c;区别如下&#x…...

数据智能驱动金融策略优化:民锋智能分析技术的应用

在现代金融市场中&#xff0c;数据分析与智能化技术的结合为投资策略带来了全新机遇。民锋以智能分析技术为核心&#xff0c;帮助投资者在复杂的市场环境中做出高效决策。本文将深入探讨民锋智能分析技术如何驱动策略优化&#xff0c;为投资者带来更加智能化的支持。 #### 一、…...

1009:带余除法

【题目描述】 给定被除数和除数&#xff0c;求整数商及余数。此题中请使用默认的整除和取余运算&#xff0c;无需对结果进行任何特殊处理。 【输入】 一行&#xff0c;包含两个整数&#xff0c;依次为被除数和除数&#xff08;除数非零&#xff09;&#xff0c;中间用一个空格隔…...

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点&#xff0c;不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码&#xff0c;是要在jmeter中用的 keytool -import -ali…...

C++基础(11.AVL树的实现)

目录 AVL的概念&#xff1a; AVL树的实现&#xff1a; AVL树的结构&#xff1a; AVL树的插⼊&#xff1a; 平衡因⼦更新&#xff1a; 旋转&#xff1a; AVL树的其他功能: AVL树平衡检测: 测试代码*2: 源代码&#xff1a; KV结构&#xff1a; 源代码&#xff1a; AVL…...

c# 抽象方法 虚函数 使用场景

在C#中&#xff0c;抽象方法&#xff08;abstract method&#xff09;和虚函数&#xff08;virtual method&#xff09;都是用于实现多态性&#xff08;polymorphism&#xff09;的重要特性&#xff0c;但它们在使用上有一些关键的区别和各自的用途。 抽象方法&#xff08;Abs…...

大数据安全方案 验证

一、背景 文档用于记录配置 Kerberos 和 Ranger 后&#xff0c;对 HDFS、Hive 认证和鉴权的功能测试。 二、Kerberos 验证 2.1、验证功能 1&#xff0c;HDFS 认证 2.1.1、访问 HDFS Kerberos 验证前&#xff0c;访问 HDFS 失败。 Kerberos 验证后&#xff0c;访问 HDFS 成…...

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…...

php反序列化靶场随笔分析

项目地址&#xff1a;github.com/mcc0624/php_ser_Class 推荐使用docker部署&#xff1a;https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础&#xff0c;我们直接从class6开始实验 class6 访问页面&#xff0c;传一个序列化的字符串&#xff0c;php代码将其反…...

动态规划 - 编辑距离

115. 不同的子序列 困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 10^9 7 取模。 算法思想&#xff1a;利用动态规划&#xff0c;分s[i - 1] 与 t[j - 1]相等&#xff0c;s[i - 1] 与 t[j - 1] 不相等两种情况具…...

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...

Pixel Epic效果实测:不同逻辑发散概率下技术路线图描述准确率对比

Pixel Epic效果实测&#xff1a;不同逻辑发散概率下技术路线图描述准确率对比 1. 测试背景与目的 Pixel Epic作为一款创新型研究报告辅助工具&#xff0c;其核心功能"贤者之智"模块采用了独特的逻辑发散机制。本次测试旨在评估不同逻辑发散概率设置对技术路线图描述…...

OFA-VE开源多模态分析系统:GPU算力优化部署实操手册

OFA-VE开源多模态分析系统&#xff1a;GPU算力优化部署实操手册 1. 系统概述与核心价值 OFA-VE是一个基于阿里巴巴达摩院OFA大模型构建的多模态推理平台&#xff0c;专门用于分析图像内容与文本描述之间的逻辑关系。这个系统不仅能看懂图片内容&#xff0c;还能理解文字描述&…...

Escornabot-lib:面向教育机器人的Arduino语义化控制库

1. Escornabot-lib 库概述Escornabot-lib 是一个专为 Escornabot 教育机器人设计的 Arduino C 类库&#xff0c;由 ROBOteach 团队维护&#xff0c;采用 GNU GPL v3.0 开源协议。该库并非仅提供抽象接口&#xff0c;而是完整封装了 Escornabot 硬件平台的全部底层驱动、状态管理…...

缺失值处理太慢?重复检测卡顿?Polars 2.0清洗提速秘技,一文掌握5大核心模式

第一章&#xff1a;Polars 2.0数据清洗性能瓶颈的本质剖析Polars 2.0 在引入 LazyFrame 默认执行模型与物理计划优化器后&#xff0c;显著提升了复杂 ETL 流水线的吞吐能力&#xff0c;但实际数据清洗场景中仍频繁出现 CPU 利用率不均、内存驻留时间过长及 UDF 执行退化等现象。…...

别只看显存!租GPU跑AI模型,这5个隐藏参数才是省钱关键

别只看显存&#xff01;租GPU跑AI模型&#xff0c;这5个隐藏参数才是省钱关键 当你在租赁平台上看到两款价格相近的24GB显存显卡时&#xff0c;是否曾困惑为何实际训练速度相差30%以上&#xff1f;显存容量只是GPU性能的冰山一角&#xff0c;真正影响性价比的往往是那些产品页面…...

新手福音:通过快马平台零代码基础理解qun329群聊应用开发

作为一个刚接触编程的新手&#xff0c;想要理解群聊应用开发确实容易一头雾水。最近我在尝试用InsCode(快马)平台搭建类似qun329的简单群聊网页时&#xff0c;发现整个过程比想象中简单很多。下面分享我的学习过程&#xff0c;希望能帮到同样零基础的朋友。 项目结构规划 首先明…...

新手福音:在快马平台用自然语言生成你的第一个powershell脚本

今天想和大家分享一个特别适合 PowerShell 新手的入门实践。作为一个从零开始学习 PowerShell 的菜鸟&#xff0c;我发现用自然语言描述需求就能生成可运行的脚本&#xff0c;这个体验真的太友好了。 变量定义与数据结构 刚开始学习时&#xff0c;最基础的就是理解变量和数据结…...

砸钱做AI却看不见回报?实测实在Agent,上千位全球高管给出的标准答案

作为深耕B2B企服与AI产品评测领域的“老兵”&#xff0c;我在企服AI产品测评局的一线实操中见过太多令人唏嘘的案例。时间来到2026年4月1日&#xff0c;站在这个节点回望&#xff0c;过去一年全球企业在生成式AI上的投入堪称疯狂——仅美国企业在2025年的花费就预计高达370亿美…...

seo优化机构怎样选择才合适_什么是seo优化机构

SEO优化机构怎样选择才合适_什么是SEO优化机构 在当今的数字化时代&#xff0c;拥有一个高效的网站已经不再是企业竞争力的唯一标准&#xff0c;更重要的是这个网站能够在搜索引擎上获得良好的排名。这就是搜索引擎优化&#xff08;SEO&#xff09;的重要性所在。选择一个合适…...

学习框架和推理引擎有什么区别

​​​​​​学习框架和推理引擎通常分别应用在 AI 大模型的训练和推理 &#xff08;运行&#xff09;阶段。模型的核心任务是从大量数据中学习规律&#xff0c;完成特定预测或者生成任务&#xff0c;前者即“模型训练”&#xff0c;后者即“模型运行”。在模型训练时&#xff…...