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

第三节:React 基础篇-React组件通信方案

React 组件通信方案详解及使用场景

以下是 React 组件通信的常用方法及其适用场景,以层级结构呈现:

一、父子组件通信

1. Props 传递

实现方式
• 父组件通过 props 向子组件传递数据。
• 子组件通过回调函数 (onEvent) 通知父组件更新。
示例

// 父组件
function Parent() {const [count, setCount] = useState(0);return <Child count={count} onIncrement={() => setCount(c => c + 1)} />;
}// 子组件
function Child({ count, onIncrement }) {return (<div><p>{count}</p><button onClick={onIncrement}>+1</button></div>);
}

适用场景:直接父子关系,数据流简单明确。
优化技巧:使用 React.memo 避免子组件无效渲染。

2. 子组件暴露方法 (useImperativeHandle)

实现方式
• 父组件通过 ref 调用子组件暴露的方法。
示例
```jsx
// 子组件
const Child = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
reset: () => console.log(“Reset triggered”)
}));
return ;
});

// 父组件
function Parent() {const childRef = useRef();return (<><Child ref={childRef} /><button onClick={() => childRef.current.reset()}>Reset</button></>);
}
```

适用场景:父组件需主动触发子组件行为(如表单重置)。


二、兄弟组件通信

1. 状态提升 (Lifting State Up)

实现方式
• 将共享状态提升至最近的共同父组件,通过 props 分发。
示例
jsx function Parent() { const [theme, setTheme] = useState("light"); return ( <> <ThemeSwitcher theme={theme} setTheme={setTheme} /> <Content theme={theme} /> </> ); }
适用场景:兄弟组件共享简单状态,层级较近。
缺点:可能导致父组件臃肿(Prop Drilling)。

2. Context API

实现方式
• 创建 Context 对象跨层级传递数据。
示例
```jsx
const ThemeContext = createContext();

function App() {const [theme, setTheme] = useState("light");return (<ThemeContext.Provider value={{ theme, setTheme }}><Toolbar /></ThemeContext.Provider>);
}function Toolbar() {return <ThemedButton />;
}function ThemedButton() {const { theme } = useContext(ThemeContext);return <button className={theme}>Apply Theme</button>;
}
```

适用场景:多层级组件共享状态(如主题、用户信息)。
优化方案:拆分 Context 或使用 useMemo 避免过度渲染。


三、复杂场景通信

1. 状态管理库 (Redux/Zustand)

Redux 示例

// Store 配置
const store = configureStore({ reducer: counterReducer });// 组件连接
function Counter() {const count = useSelector(state => state.value);const dispatch = useDispatch();return (<button onClick={() => dispatch(increment())}>{count}</button>);
}

Zustand 示例

const useStore = create(set => ({count: 0,increment: () => set(state => ({ count: state.count + 1 }))
}));function Counter() {const { count, increment } = useStore();return <button onClick={increment}>{count}</button>;
}

优势:集中管理复杂状态,支持中间件和调试工具。
选择建议
Redux:大型应用,需严格状态追踪。
Zustand:轻量级需求,快速集成。

2. useSyncExternalStore(React 18+)

实现方式
• 订阅外部存储(如 Redux Store)并同步状态。
示例
jsx function ReduxCounter() { const count = useSyncExternalStore( store.subscribe, () => store.getState().count ); return <div>{count}</div>; }
应用场景:集成外部状态管理库,确保并发模式兼容性。
优势:替代 useEffect 订阅,避免状态撕裂 (Tearing)。


四、方案对比与选择指南

通信方式适用场景优点缺点
Props/Callback简单父子组件直接易用Prop Drilling
Context跨层级共享低频状态避免层层传递性能敏感场景需优化
Redux/Zustand复杂全局状态(用户会话、主题)可预测性强,工具链完善学习成本较高
useSyncExternalStore集成外部存储 + 并发模式支持高性能,框架级集成需手动管理订阅逻辑

五、最佳实践建议

  1. 优先局部状态:能用 useState/useReducer 解决的问题,不提升状态。
  2. 慎用 Context:避免高频更新数据(如每秒变化的计数器)通过 Context 传递。
  3. 按需选择库:中小项目优先考虑 Zustand,大型应用使用 Redux。
  4. 性能优化:对大型列表或复杂组件使用 memo/useMemo

相关文章:

第三节:React 基础篇-React组件通信方案

React 组件通信方案详解及使用场景 以下是 React 组件通信的常用方法及其适用场景&#xff0c;以层级结构呈现&#xff1a; 一、父子组件通信 1. Props 传递 • 实现方式&#xff1a; • 父组件通过 props 向子组件传递数据。 • 子组件通过回调函数 (onEvent) 通知父组件更…...

✨ MOS开关的非线性因素详解 ✨

MOS 开关在模拟电路、开关电源等应用中广泛使用&#xff0c;但其导通特性存在非线性&#xff0c;可能导致信号失真或系统性能下降。以下是主要非线性因素及解决思路&#xff1a; &#x1f527; 1. 导通电阻&#xff08;Ron&#xff09;的非线性 机理&#xff1a; Ron 并非固定值…...

解决vcpkg使用VS2022报错问题

转自个人博客&#xff1a;解决vcpkg使用VS2022报错问题 最近&#xff0c;在把Visual Studio2019完全更新到最新Visual Studio2022后&#xff0c;原使用的vcpkg无法正常安装包&#xff0c;会报如下与Visual Studio 2022相关的错误&#xff1a; error: in triplet x64-windows-m…...

基于支持向量回归(SVR)的空气质量预测

基于支持向量回归&#xff08;SVR&#xff09;的空气质量预测 1.作者介绍2.支持向量回归&#xff08;SVR&#xff09;算法介绍2.1 算法原理2.2 关键概念2.3算法特点2.4与其他回归方法对比 3.基于支持向量回归&#xff08;SVR&#xff09;的空气质量预测实验3.1数据集介绍3.2代码…...

【数据结构】排序

目录 1.排序的概念及其运用 1.1排序的概念 1.2常见排序算法 2插入排序 2.1直接插入排序 2.1.1基本思想 2.1.2代码实现 2.1.3特性总结 2.2 希尔排序 2.2.1基本思想 2.2.2代码实现 3.选择排序 3.1选择排序 3.1.1基本思想 3.1.2代码实现 3.1.3特性总结 3.2 堆排…...

4185 费马小定理求逆元

4185 费马小定理求逆元 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;费马小定理 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …...

低代码控件开发平台:飞帆中粘贴富文本的控件

效果&#xff1a; 链接&#xff1a; https://fvi.cn/729...

偶氮二异丁腈(AIBN)的物化性质及其在合成中的应用

偶氮二异丁腈(AIBN)是一种常用的自由基引发剂&#xff0c;是一种白色结晶性粉末&#xff0c;不溶于水&#xff0c;但溶于甲醇、乙醇、丙酮、乙醚、甲苯等有机溶剂和乙烯基单体。 AIBN在60℃以上会分解形成异丁腈基&#xff0c;从而引发自由基反应。其分解温度区间为50&#xff…...

3.1.3.2 Spring Boot使用Servlet组件

在Spring Boot应用中使用Servlet组件&#xff0c;可以通过注解和配置类两种方式注册Servlet。首先&#xff0c;通过WebServlet注解直接在Servlet类上定义URL模式&#xff0c;Spring Boot会自动注册该Servlet。其次&#xff0c;通过创建配置类&#xff0c;使用ServletRegistrati…...

java——HashSet底层机制——链表扩容和树化

HashSet在Java中是基于HashMap实现的&#xff0c;它实际上是将所有元素作为HashMap的key存储&#xff0c;而value则统一使用一个静态的Object对象(Present)作为占位符。 1.举例演示 下面我们就举例说明一下&#xff0c;HashSet集合中&#xff0c;一个节点上的链表添加数据以及…...

玩转Docker | 使用Docker搭建Blog微博系统

玩转Docker | 使用Docker搭建Blog微博系统 前言一、Blog介绍项目简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Blog服务下载镜像创建容器检查容器状态设置权限检查服务端口安全设置四、访问Blog系统访问Blog首页登录Blog五、总结前言 在数字…...

Linux中的Vim与Nano编辑器命令详解

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4-turbo模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中代码与命令建议通过官方渠道验证。 在Linux系统中&#xff0c;文本编辑是最常用的…...

G1垃圾回收器介绍

G1垃圾回收器简介 全称&#xff1a;Garbage-First Garbage Collector。目的&#xff1a;G1垃圾回收器是为了替代CMS垃圾回收器而设计的&#xff0c;它旨在提供更好的垃圾回收性能和可预测性&#xff0c;特别是在处理大内存堆时。特点&#xff1a;G1是一种服务器端的垃圾回收器…...

Python学习笔记(三)

文章目录 Python函数详解基本概念定义函数函数调用参数类型1. 位置参数2. 默认参数3. 关键字参数4. 可变参数 返回值函数作用函数中的变量作用域规则 递归函数Lambda函数函数注解装饰器文档字符串其他重要概念闭包生成器函数高阶函数 Python函数详解 基本概念 函数是Python中…...

Hqst的超薄千兆变压器HM82409S在Unitree宇树Go2智能机器狗的应用

本期拆解带来的是宇树科技推出的Go2智能机器狗&#xff0c;这款机器狗采用狗身体形态&#xff0c;前端设有激光雷达&#xff0c;摄像头和照明灯。在腿部设有12个铝合金精密关节电机&#xff0c;并配有足端力传感器&#xff0c;通过关节运动模拟狗的运动&#xff0c;并可做出多种…...

TaskFlow开发日记 #1 - 原生JS实现智能Todo组件

一、项目亮点 - &#x1f4cc; **零依赖实现**&#xff1a;纯原生JavaScript CSS3 - &#x1f4cc; **数据持久化**&#xff1a;LocalStorage自动同步 - &#x1f4cc; **交互优化**&#xff1a;收藏置顶 动态统计 - &#x1f4cc; **响应式设计**&#xff1a;完美适配移动端…...

es的告警信息

Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;在运行过程中可能会产生多种告警信息&#xff0c;以提示用户系统中存在的潜在问题或异常情况。以下是一些常见的 ES 告警信息及其含义和处理方法&#xff1a; 集群健康状态告警 信息示例…...

vue实现在线进制转换

vue实现在线进制转换 主要功能包括&#xff1a; 1.支持2-36进制之间的转换。 2.支持整数和浮点数的转换。 3.输入验证&#xff08;虽然可能存在不严格的情况&#xff09;。 4.错误提示。 5.结果展示&#xff0c;包括大写字母。 6.用户友好的界面&#xff0c;包括下拉菜单、输…...

责任链设计模式(单例+多例)

目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客&#xff01;26届java选手&#xff0c;一起加油&#x1f498;&#x1f4a6;&#x1f468;‍&#x1f393;&#x1f604;&#x1f602; 最近在…...

Matlab 分数阶PID控制永磁同步电机

1、内容简介 Matlab 203-分数阶PID控制永磁同步电机 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

Java中LocalDateTime类

Java中的日期类 Date类LocalDateTime类创建LocalDateTime对象1 获取当前时间2 获取自己指定时间3 字符串创建日期 获取当前日期的信息1获取当前日期的年月日 时分秒2 获取当前日期周几\当年第几天\当月第几天3 获取当前⽇期所在周的周⽇和周⼀ 日期的运算1日期加减天数2 日期加…...

【C语言】--- 文件操作

文件操作 1. 为什么要使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进程文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1流4.2.2标准流 4.2 文件指针4.3 打开和关闭操作 5. 文件的顺序读写5.1 文件顺序读写函数5.1.1 fgetc 和 fputc5.1.2 fgets 和 fg…...

操作系统 4.4-从生磁盘到文件

文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块&#xff08;block&#xff09;和文件&#xff08;file&#xff09;之间&#xff0c;使得用户可以以更直观和易于理解的方式与磁盘交互&#xff0c;而无需直接处理磁盘的物理细节如扇区&#xff08;se…...

第六章 进阶03 外包测试亮相

因为有年度重点项目&#xff0c;团队缺少测试资源&#xff0c;所以临时招聘了一个外包测试&#xff08;后文用J代指&#xff09;&#xff0c;让产品经理亮亮来带她。 到今天J差不多入职有1个月时间了&#xff0c;亮亮组了个会&#xff0c;一起评审下J做的测试用例。 J展示了其…...

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中&#xff0c;测试是至关重要的一环。然而&#xff0c;在传统开发中&#xff0c;测试常常被忽略或草草处理&#xff0c;很多时候并非开发人员故意为之&#xff0c;而是缺乏相应的测试思路和方法&#xff0c;不知道如何设计测试用例。随着 AI 技术的飞…...

使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键

目录 使用 nano 编辑器保存并关闭文件使用 sed 命令直接修改文件验证更改 如果你正在使用 nano 文本编辑器来修改 ~/.bashrc 文件&#xff0c;以下是保存并关闭文件的具体步骤&#xff1a; 使用 nano 编辑器保存并关闭文件 打开 ~/.bashrc 文件 在终端中运行以下命令&#xf…...

计算机组成原理——CPU与存储器连接例题

计算机组成原理——CPU与存储器连接例题 设CPU共有16根地址线和8根数据线&#xff0c;并用(MREQ) ̅作为访存控制信号&#xff08;低电平有效&#xff09;&#xff0c;(WR) ̅作为读/写命令信号&#xff08;高电平读&#xff0c;低电平写&#xff09;。现有下列存储芯片&#…...

SQL 外键(Foreign Key)详细讲解

1. 什么是外键&#xff1f;​​ ​​定义​​&#xff1a;外键是数据库表中的一列&#xff08;或一组列&#xff09;&#xff0c;用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键&#xff08;Primary Key&#xff09;或唯一约束&#xff08;Unique Con…...

B3647 【模板】Floyd

题目链接&#xff1a;点击进入 题目 思路 代码 #include <bits/stdc.h> #define inf 0x3f3f3f3f using namespace std; const int maxn 1e6 10;int n,m,g[110][5000];int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;memse…...

配置镜像端口和观察接口

top&#xff1a; 在G0/0/2上抓包通过其他端口ping pc4 可以看到 Wireshark 抓包没有任何反应&#xff0c;做个镜像端口并配置&#xff08;观察接口和镜像接口&#xff09; observe-port interface g0/0/2 #命令配置观察端口mirror to observe-port both …...

爬虫解决debbugger之替换文件

鼠鼠上次做一个网站的时候&#xff0c;遇到的debbugger问题&#xff0c;是通过打断点然后编辑断点解决的&#xff0c;现在鼠鼠又学会了一个新的技能 首先需要大家下载一个reres的插件&#xff0c;这里最好用谷歌浏览器 先请大家看看案例国家水质自动综合监管平台 这里我们只…...

erlang的安装-linux

1&#xff1a;解压 tar -zxvf 安装包 2&#xff1a;进入解压的目录执行&#xff1a; ./configure --prefix/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac 3&#xff1a;编译安装&#xff1a; m…...

Android Coil 3默认P3色域图加载/显示不出来

Android Coil 3默认P3色域图加载/显示不出来 解决&#xff0c;需要在Androidmanifest.xml使用Coil 3的activity配置属性&#xff1a; <activityandroid:colorMode"wideColorGamut"...</activity>...

【LaTeX】安装

Register - Overleaf, 在线LaTeX编辑器 注册Overleaf 安装 Latex2022 安装教程&#xff08;附安装资源&#xff09;_tex2022安装教程-CSDN博客 注&#xff1a;先安装 texlive&#xff0c;再安装TexStudio \documentclass{article} % 这里是导言区 \begin{document}Hello, wor…...

【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)

目录 【2025年认证杯数学建模挑战赛】A题解题建模过程与模型代码&#xff08;基于matlab&#xff09;A题 小行星轨迹预测解题思路第一问模型与求解第二问模型与求解 【2025年认证杯数学建模挑战赛】A题 解题建模过程与模型代码&#xff08;基于matlab&#xff09; A题 小行星轨…...

【KWDB 创作者计划】KWDB 数据库全维度解析手册

——从原理到实践&#xff0c;构建下一代数据基础设施 ​第一章&#xff1a;KWDB 设计哲学与技术全景 1.1 为什么需要 KWDB&#xff1f; 在数据爆炸与业务场景碎片化的今天&#xff0c;传统数据库面临三大挑战&#xff1a;​扩展性瓶颈​&#xff08;单机性能天花板&#xff…...

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端&#xff1f;深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下&#xff0c;软件开发领域新思潮与新技术不断涌现&#xff0c;引发行业内外热烈探讨。近日&#xff0c;笔者收到这样一个颇具争议的问题&#xff1a;“低代码开发能取代后端吗&#xff1f…...

LeetCode hot 100—最长回文子串

题目 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "cb…...

蓝桥杯知识总结

文章目录 1.常用的数学方法2.大小写转换3.数组和集合排序数组排序集合排序 4.控制小数位数5.栈6.队列7.字符串相关方法8.十进制转n进制模板字符转为十进制某进制转化为十进制 9.前缀和10.差分11.离散化12.双指针13.二分14.枚举模板组合型枚举模板排列型枚举模板 15.搜索算法BFS…...

leetcode:2839. 判断通过操作能否让字符串相等 I(python3解法)

难度&#xff1a;简单 给你两个字符串 s1 和 s2 &#xff0c;两个字符串的长度都为 4 &#xff0c;且只包含 小写 英文字母。 你可以对两个字符串中的 任意一个 执行以下操作 任意 次&#xff1a; 选择两个下标 i 和 j 且满足 j - i 2 &#xff0c;然后 交换 这个字符串中两个…...

Python Lambda表达式详解

Python Lambda表达式详解 1. Lambda是什么&#xff1f; Lambda是Python中用于创建匿名函数&#xff08;没有名字的函数&#xff09;的关键字&#xff0c;核心特点是简洁。它适用于需要临时定义简单函数的场景&#xff0c;或直接作为参数传递给高阶函数&#xff08;如map()、f…...

Matlab 平衡车的建模与控制

1、内容简介 Matlab 189-平衡车的建模与控制 可以交流、咨询、答疑 2、内容说明 略 平衡车的建模与控制 选择一款平衡车&#xff08;如&#xff1a;小米九号平衡车等&#xff09;&#xff0c;并估计平衡车的关键参数。完成以下工作&#xff1a; 1. 建立平衡车模型&#xf…...

KWDB创作者计划—KWDB关系库与时序库混搭

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

Android studio2024的第一个安卓项目

目录 一、创建项目 1、创建Empty Views Activity类型项目 2、Android项目结构解析 manifests 目录&#xff1a; Gradle Scripts目录 3、创建安卓应用 二、测试 1、模拟器测试效果 2、连接真机&#xff0c;然后直接选择真机运行即可&#xff08;点击Run或Shift F10运行…...

航电系统之障碍物监测技术篇

航电系统的障碍物监测技术是保障飞行安全、提升飞行效率的核心技术之一&#xff0c;尤其在复杂环境和低空飞行中发挥着关键作用。以下从技术原理、传感器类型、数据处理与应用等方面进行系统介绍&#xff1a; 一、技术原理 航电系统的障碍物监测技术通过多传感器融合和智能算法…...

网站DDoS防护方案——构建企业级安全屏障的关键路径

本文深度解析DDoS攻击最新演变趋势与防御技术体系&#xff0c;通过攻击特征图谱、云原生防护架构、混合防御模型等维度&#xff0c;揭示企业级网站防护方案的设计逻辑。结合2023年金融行业千万级QPS攻击事件&#xff0c;引用Gartner最新防御技术成熟度曲线&#xff0c;给出可落…...

Linux系统使用lshw生成硬件报告方法

使用 lshw 生成 HTML 硬件报告指南 一、工具简介 lshw(List Hardware)是 Linux 系统下用于检测并报告硬件详细信息的命令行工具,支持输出多种格式(文本、HTML、XML 等)。 核心功能: 显示 CPU、内存、磁盘、PCI/USB 设备等完整硬件信息生成结构化报告,便于存档或分析支…...

力扣 905 按奇偶排序数组:双指针法的优雅实现

目录 问题背景 题目解析 解题思路 暴力解法 双指针法 代码实现 代码解析 算法效率 实际应用场景 总结 问题背景 在编程的世界里&#xff0c;数组排序问题一直是经典中的经典。今天我们要解决的是一个有趣的变种&#xff1a;按奇偶排序数组。题目要求我们将一个整数数…...

LeetCode hot 100—子集

题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2…...

BERT - BertTokenizer, BertModel API模型微调

本节代码将展示如何在预训练的BERT模型基础上进行微调&#xff0c;以适应特定的下游任务。 ⭐学习建议直接看文章最后的需复现代码&#xff0c;不懂得地方再回看 微调是自然语言处理中常见的方法&#xff0c;通过在预训练模型的基础上添加额外的层&#xff0c;并在特定任务的…...