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

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>);};

相关文章:

react 中 useContext Hook 作用

useContext是一个用于在组件之间共享数据的重要钩子函数 一、跨组件数据共享 1. 简化多层级组件数据传递 例如&#xff1a;在一个具有多层级菜单结构的应用中&#xff0c;如果要将用户权限数据从根组件传递到最深层的菜单项组件&#xff0c;可能需要经过多个中间组件的 prop…...

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

前 K 个高频元素

前 K 个高频元素 ​ 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]提示&#xff1a; 1 < nums.le…...

【ubuntu】Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件&#xff0c; 目前已经覆盖了&#xff0c; windows&#xff0c;android&#xff0c; mac, linux 等操作系统。 Ubuntu 现状 Ubuntu 自带应用市场 Ubuntu 自带应用市场目前只有 Geogebra 4.0 版本&#xff0c; 不能画立…...

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…...

一文读懂LEED绿建

LEED绿建&#xff0c;即获得LEED&#xff08;Leadership in Energy and Environmental Design&#xff09;认证的建筑&#xff0c;是一个旨在提高建筑环境性能和健康性能的评估体系。以下是对LEED绿建的详细解读&#xff1a; 一、LEED体系概述 定义&#xff1a;LEED是由美国绿…...

git上feature合并到development分支

git上从development分支拉了一个feature分支开发新内容&#xff0c;development也有新内容在开发&#xff0c;feature分支内容开发完毕后&#xff0c;如何合并feature分支新内容到development分支&#xff0c;要确保不会覆盖development分支的新内容 以下是将 feature 分支的新…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法

在当今社会&#xff0c;安全监控已成为各类场所不可或缺的一部分。无论是家庭、学校、商业场所还是公共场所&#xff0c;安全监控设备都扮演着至关重要的角色。在众多监控品牌中&#xff0c;大华IPC摄像头凭借其高清画质、强大功能和卓越稳定性&#xff0c;赢得了市场的广泛认可…...

校园二手交易网站毕业设计基于SpringBootSSM框架

目录 一、引言 二、需求分析 2.1用户需求分析 2.1.1学生用户 2.1.2管理员 2.2系统功能需求 2.3系统非功能需求 ‌2.4技术需求 ‌2.4.1 技术选择 ‌2.4.2系统架构‌ 三、详细设计 3.1系统架构设计‌ ‌3.2前端设计‌ ‌3.3后端设计‌ ‌3.4数据库设计‌ 本文介绍…...

基于大语言模型意图识别和实体提取功能;具体ZK数值例子:加密货币交易验证;

目录 基于大语言模型意图识别和实体提取功能 案例背景 零知识证明过程 具体例子 具体举例(简化) 具体ZK数值例子:加密货币交易验证 定义多项式 承诺 挑战 证明构造 证明验证 结论 zkLLM Zero Knowledge Proofs for Large Language Models 在大模型验证过程中处…...

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐&#xff0c;可以是书籍&#xff0c;可以是运动&#xff0c;可以是工作&#xff0c;可以是山川湖海&#xff0c;唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…...

机器学习系列----KNN分类

目录 前言 一.KNN算法的基本原理 二.KNN分类的实现 三.总结 前言 在机器学习领域&#xff0c;K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种非常直观且常用的分类算法。它是一种基于实例的学习方法&#xff0c;也被称为懒学习&#xff08;Lazy Learnin…...

贪心算法day 06

1.最长回文串 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;计算每个字符个数如果是偶数个那么肯定可以组成回文串&#xff0c;如果是奇数个就会有一个无法组成回文串&#xff0c;但是在最中间还是可以有一个不是成队的字符这个字符就从多的奇…...

HTML之列表学习记录

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…...

Redo与Undo的区别:数据库事务的恢复与撤销机制

在数据库中&#xff0c;redo 和 undo 是两个非常重要的概念&#xff0c;它们主要用于事务管理和恢复机制&#xff0c;确保数据的一致性和完整性。 下面分别解释这两个概念&#xff1a; Redo&#xff08;重做&#xff09; 定义&#xff1a;redo 操作记录了事务对数据库所做的所…...

【话题讨论】AI赋能电商:创新应用与销售效率的双轮驱动

目录 引言 一、AI技术在电商中的创新应用 1.1 购物推荐 1.2 会员分类 1.3 商品定价 1.4 用户体验 总结 二、AI技术提高电商平台销售效率 2.1 订单处理 2.2 物流配送 2.3 产品流转效率 2.4 库存管理和订单管理效率 2.5 实际案例分析 三、挑战和未来发展趋势 3.1…...

重构开发之道,Blackbox.AI为技术注入智能新动力

本文目录 一、引言二、Blackbox.AI实战体验2.1 基于网页界面生成前端代码进行应用开发2.2 与AI助手实现实时智能对话2.3 重塑大型文件交互方式2.4 链接Github仓库进行对话编程 三、总结 一、引言 在生产力工具加速进化的浪潮中&#xff0c;Blackbox.AI开始崭露头角&#xff0c…...

机器学习在医疗健康领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 机器学习在医疗健康领域的应用 机器学习在医疗健康领域的应用 机器学习在医疗健康领域的应用 引言 机器学习概述 定义与原理 发展…...

M芯片Mac构建Dockerfile - 注意事项

由于MacBook的M芯片架构与intel不同&#xff0c;交叉构建Linux服务器docker镜像&#xff0c;需要以下步骤完成&#xff1a; 编写好Dockerfile在命令行中&#xff0c;执行构建命令&#xff1a; docker buildx build --platform linux/amd64 -t ${image_name}:${tag} ....

系统架构设计师论文

软考官网&#xff1a;中国计算机技术职业资格网 (ruankao.org.cn) 2019年 2019年下半年试题二&#xff1a;论软件系统架构评估及其应用...

速盾:CDN 和高防有什么区别?

在网络安全和性能优化领域&#xff0c;CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;和高防服务是两个重要的概念&#xff0c;它们在功能、原理和应用场景方面存在诸多区别。 一、CDN &#xff08;一&#xff09;基本原理与功能 内容加速分发…...

goframe开发一个企业网站 rabbitmq队例15

RabbitMQ消息队列封装 在目录internal/pkg/rabbitmq/rabbitmq.go # 消息队列配置 mq:# 消息队列类型: rocketmq 或 rabbitmqtype: "rabbitmq"# 是否启用消息队列enabled: truerocketmq:nameServer: "127.0.0.1:9876"producerGroup: "myProducerGrou…...

设计模式-七个基本原则之一-迪米特法则 + 案例

迪米特法则:(LoD) 面向对象七个基本原则之一 只与直接的朋友通信&#xff1a;对象应只与自己直接关联的对象通信&#xff0c;例如&#xff1a;方法参数、返回值、创建的对象。避免“链式调用”&#xff1a;尽量避免通过多个对象链进行调用。例如&#xff0c;a.getB().getC().do…...

【数学二】线性代数-二次型

考试要求 1、了解二次型的概念, 会用矩阵形式表示二次型,了解合同变换与合同矩阵的概念. 2、了解二次型的秩的概念,了解二次型的标准形、规范形等概念,了解惯性定理,会用正交变换和配方法化二次型为标准形。 3、理解正定二次型、正定矩阵的概念,并掌握其判别法. 二次型…...

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…...

HTB:Sea[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 使用curl访问靶机80端口 使用ffuf对靶机进行了一顿FUZZ 尝试在Github上搜索版权拥有者 除了LICENSE还FUZZ出了version文件尝试访问 尝试直接在Github搜索该符合该版本的EXP 横向移动 使用john对该哈…...

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…...

ECharts图表图例8

用eclipse软件制作动态单仪表图 用java知识点 代码截图&#xff1a;...

Redis中的线程模型

Redis 的单线程模型详解 Redis 的“单线程”模型主要指的是其 主线程&#xff0c;这个主线程负责从客户端接收请求、解析命令、处理数据和返回响应。为了深入了解 Redis 单线程的具体工作流程&#xff0c;我们可以将其分为以下几个步骤&#xff1a; 接收客户端请求 Redis 的主线…...

[产品管理-77]:技术人需要了解的常见概念:科学、技术、技能、产品、市场、商业模式、运营

目录 一、概念定义 科学 技术 技能 产品 市场 商业模式 运营 二、上述概念在产品创新中的作用 一、概念定义 对于技术人来说&#xff0c;了解并掌握科学、技术、技能、产品、市场、商业模式、运营等常见概念的定义至关重要。以下是这些概念的详细解释&#xff1a; 科…...