react 中 useContext Hook 作用

`useContext`是一个用于在组件之间共享数据的重要钩子函数

一、跨组件数据共享

1. 简化多层级组件数据传递

例如:在一个具有多层级菜单结构的应用中,如果要将用户权限数据从根组件传递到最深层的菜单项组件,可能需要经过多个中间组件的 props 传递,使得代码变得复杂且难以维护。而`useContext`提供了一种解决方案,通过创建和使用上下文,可以直接在需要数据的组件中获取,无需经过中间组件的层层传递。

2. 代码示例

// 创建一个上下文const UserContext = React.createContext();// 在顶层组件中提供数据const App = () => {const userData = { name: "John", role: "admin" };return (<UserContext.Provider value={userData}><ComponentA /></UserContext.Provider>);};// 深层嵌套的组件可以直接获取数据const ComponentC = () => {const userData = React.useContext(UserContext);return (<div>{userData.name} - {userData.role}</div>);};const ComponentB = () => {return <ComponentC />;};const ComponentA = () => {return <ComponentB />;};

二、实现全局数据共享

1. 应用场景

例如:在一个多语言应用中,语言环境数据可以通过上下文在整个应用的各个组件中共享。当语言环境发生改变时,所有使用该语言环境数据的组件都可以方便地做出响应。

2. 代码示例

// 创建语言环境上下文const LanguageContext = React.createContext();// 在顶层组件中设置语言环境const App = () => {const language = "en";return (<LanguageContext.Provider value={language}><Header /><MainContent /><Footer /></LanguageContext.Provider>);};// 不同的组件可以获取语言环境数据const Header = () => {const language = React.useContext(LanguageContext);// 根据语言环境渲染不同的标题return language === "en" ? <h1>English Title</h1> : <h1>中文标题</h1>;};const MainContent = () => {const language = React.useContext(LanguageContext);// 根据语言环境显示不同的内容return language === "en" ? <p>English Content</p> : <p>中文内容</p>;};const Footer = () => {const language = React.useContext(LanguageContext);// 根据语言环境显示不同的版权信息return language === "en" ? (<p>Copyright in English</p>) : (<p>版权信息(中文)</p>);};

三、组件状态的统一管理

1. 共享状态的更新与同步

例如:在一个主题切换的应用中,如果通过上下文共享了主题颜色状态,当用户切换主题颜色时,改变上下文的主题颜色值,所有使用该主题颜色的组件都会根据新的值重新渲染。

2. 代码示例

// 创建主题颜色上下文const ThemeContext = React.createContext();// 主题切换组件const ThemeToggle = () => {const [theme, setTheme] = React.useState("light");const toggleTheme = () => {setTheme(theme === "light" ? "dark" : "light");};return (<ThemeContext.Provider value={theme}><button onClick={toggleTheme}>Toggle Theme</button><ComponentUsingTheme /></ThemeContext.Provider>);};// 使用主题颜色的组件const ComponentUsingTheme = () => {const theme = React.useContext(ThemeContext);const backgroundColor = theme === "light" ? "white" : "black";const color = theme === "light" ? "black" : "white";return (<div style={{ backgroundColor, color }}>This component uses the {theme} theme.</div>);};

四、与其他状态管理方法的结合

1. 与 Redux 或 useReducer 的协同作用

例如:在使用`useReducer`管理复杂状态的同时,可以通过`useContext`将状态和更新状态的`dispatch`函数在组件之间共享。这样,既可以利用`useReducer`的可预测状态更新逻辑,又可以通过`useContext`方便地在多个组件中使用和更新状态。

2. 代码示例

// 创建一个上下文来传递状态和dispatch函数const StateContext = React.createContext();// 定义reducer和初始状态const reducer = (state, action) => {switch (action.type) {case "INCREMENT":return { count: state.count + 1 };case "DECREMENT":return { count: state.count - 1 };default:return state;}};const initialState = { count: 0 };// 在顶层组件中使用useReducer并通过上下文共享const App = () => {const [state, dispatch] = React.useReducer(reducer, initialState);return (<StateContext.Provider value={{ state, dispatch }}><Counter /></StateContext.Provider>);};// 组件可以通过useContext获取状态和dispatch函数const Counter = () => {const { state, dispatch } = React.useContext(StateContext);return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: "INCREMENT" })}>Increment</button><button onClick={() => dispatch({ type: "DECREMENT" })}>Decrement</button></div>);};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14678.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring如何解决循环依赖的问题

Spring 如何解决循环依赖的问题 Spring 是通过三级缓存来解决循环依赖问题&#xff0c;第一级缓存里面存储完整的Bean实例&#xff0c;这些实例是可以直接被使用的&#xff0c;第二级缓存存储的是实例化后但是还没有设置属性值的Bean实例&#xff0c;也就是Bean里面的 依赖注入…

深度图变换器的新突破:DeepGraph

人工智能咨询培训老师叶梓 转载标明出处 在图变换器领域&#xff0c;尽管其全局注意力机制在图结构数据处理上显示出了巨大潜力&#xff0c;但现有的图变换器模型却普遍较浅&#xff0c;通常不超过12层。这一现象引发了学者们对于“增加层数是否能进一步提升图变换器性能”的深…

单体架构 IM 系统之 Server 节点状态化分析

基于 http 短轮询模式的单体架构的 IM 系统见下图&#xff0c;即客户端通过 http 周期性地轮询访问 server 实现消息的即时通讯&#xff0c;也就是我们前面提到的 “信箱模型”。“信箱模型” 虽然实现非常容易&#xff0c;但是消息的实时性不高。 我们在上一篇文章&#xff08…

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

&#x1f680; 11月12日&#xff0c;阿里云通义大模型团队宣布开源通义千问代码模型全系列&#xff0c;共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果&#xff0c;其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩&#xff0c;成为全球最强…

计算机网络(8)数据链路层之子层

上一篇已经讲到数据链路层可以分为两个子层&#xff0c;这次将重点讲解子层的作用和ppp协议 数据链路层的子层 数据链路层通常被分为两个子层&#xff1a; 逻辑链路控制子层&#xff08;LLC&#xff0c;Logical Link Control&#xff09;&#xff1a; LLC子层负责在数据链路…

【操作系统】输入/输出(I/O)管理

王道笔记 一、I/O管理描述 1.1 I/O设备的概念和分类 1.1.1 什么是I/O设备 “I/O”就是“输入/输出”&#xff08;Input/Output&#xff09; I/O设备机会可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。下图就…

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III309.买卖股票的最佳时机含冷冻期

Day44 | 动态规划 &#xff1a;状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 买卖股票的最佳时机【…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter&#xff0c;一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同&#xff0c;返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

git config是做什么的?

git config是做什么的&#xff1f; git config作用配置级别三种配置级别的介绍及使用&#xff0c;配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级&#xff1f; 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路&#xff1a; 这是一个二叉树的布尔评估问题。树的每个节点包含一个值&#xff0c;其中叶子节点值为 0 或 1&#xff0…

2023年MathorCup数学建模A题量子计算机在信用评分卡组合优化中的应用解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 A题 量子计算机在信用评分卡组合优化中的应用 原题再现&#xff1a; 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能…

嵌入式开发套件(golang版本)

1. watchdog&#xff08;软件看门狗&#xff1a;守护升级&#xff09; 2. gate&#xff08;主程序&#xff09; 3. web&#xff08;api版本 升级包&#xff09; OTA 升级流程 watchdog启动后检查守护进程gate是否正在运行&#xff0c;如果没有&#xff0c;api对比版本号&am…

解压专家 2.4.12| 多功能解压缩工具,支持密码共享、音乐播放和歌词匹配。

解压专家是一款功能强大的解压缩软件&#xff0c;提供了类似于WIFI万能钥匙的密码分享功能&#xff0c;帮助用户快速获取共享的解压密码。作为专业的解压缩工具&#xff0c;它支持多种常见和不常见的压缩包格式&#xff0c;如ZIP、RAR、7z、TAR.GZ和ISO等&#xff0c;并且还支持…

并发编程(10)——内存模型和原子操作

文章目录 十、day101. 内存模型基础1.1 对象和内存区域1.2 改动序列 2. 原子操作及其类型2.1 原子操作2.2 原子类型2.3 内存次序2.4 std::atomic_flag2.4.1 自旋锁 2.5 std::atomic&#xff1c;bool&#xff1e;2.6 std::atomic<T*>2.7 标准整数原子类型2.8 std::atomic&…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

ffmpeg+D3D实现的MFC音视频播放器,支持录像、截图、音视频播放、码流信息显示等功能

一、简介 本播放器是在vs2019下开发&#xff0c;通过ffmpeg实现拉流解码功能&#xff0c;通过D3D实现视频的渲染功能。截图功能采用libjpeg实现&#xff0c;可以截取jpg图片&#xff0c;图片的默认保存路径是在C:\MYRecPath中。录像功能采用封装好的类Mp4Record实现&#xff0c…

webpack指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack-指南 概念 中文&#xff1a; webpack | webpack中文文档 | webpack中文网 英文&…

把越南语翻译成中文一般用什么翻译工具?《越南语翻译通》App或许能满足你的技术痛点需求!

在多语言交流日益频繁的今天&#xff0c;掌握越南语对于商务、旅游或学术交流都是一项重要技能。《越南语翻译通》App应运而生&#xff0c;旨在通过技术手段简化越南语学习和翻译过程&#xff0c;满足用户在不同场景下的需求。 核心技术 《越南语翻译通》App采用了先进的自然语…