【useContext Hook】解决组件树层级较深时props逐级传递问题

文章目录

    • 引言
    • 项目结构
    • 创建上下文
      • ThemeContext.tsx
    • 提供上下文
      • Test.tsx
    • 消费上下文
      • Parent.tsx
      • Child.tsx
    • 应用入口
      • App.tsx
    • 总结

引言

在 React 应用中,状态管理是一个常见的需求。React 提供了多种方式来管理状态,其中 useContext 是一种简单且高效的方式,特别适用于全局状态的管理。本文将通过一个具体的例子——实现主题切换功能,来详细介绍如何使用 useContext

项目结构

我们的项目结构如下:

src/
├── App.tsx
└── components/└── useContext/├── Child.tsx├── Parent.tsx├── Test.tsx└── ThemeContext.tsx

创建上下文

首先,我们需要创建一个上下文(Context),用于在整个应用中共享主题状态和更新主题的方法。

ThemeContext.tsx

// src/components/useContext/ThemeContext.tsx
import { createContext, useContext, useState } from 'react';interface ThemeContextType {theme: string;setTheme: (theme: string) => void;
}export const ThemeContext = createContext<ThemeContextType | undefined>(undefined);export function useTheme() {const context = useContext(ThemeContext);if (!context) {throw new Error('useTheme must be used within a ThemeContext.Provider');}return context;
}

在这个文件中,我们定义了一个 ThemeContext,并导出了一个自定义 Hook useTheme,用于在组件中访问上下文中的值。

提供上下文

接下来,在 Test.tsx 中提供上下文,并初始化主题状态。

Test.tsx

// src/components/useContext/Test.tsx
import { useState } from 'react';
import { ThemeContext } from './ThemeContext';
import Parent from './Parent';export default function Test() {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={{ theme, setTheme }}><Parent /></ThemeContext.Provider>);
}

在这里,我们使用 useState 初始化主题状态,并通过 ThemeContext.Provider 将状态传递给子组件。

消费上下文

现在,我们在 Parent.tsxChild.tsx 中消费上下文,以实现主题切换功能。

Parent.tsx

// src/components/useContext/Parent.tsx
import { useTheme } from './ThemeContext';
import Child from './Child';export default function ParentComponent() {const { theme, setTheme } = useTheme();const styles = {width: '200px',height: '200px',background: theme === 'light' ? 'white' : 'black',color: theme === 'light' ? 'black' : 'white',};return (<div><div style={styles}><p>ParentComponent</p><button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>{theme === 'light' ? '切换黑色主题' : '切换亮色主题'}</button></div><div><Child /></div></div>);
}

Child.tsx

// src/components/useContext/Child.tsx
import { useTheme } from './ThemeContext';export default function ChildComponent() {const { theme, setTheme } = useTheme();const styles = {width: '200px',height: '200px',background: theme === 'light' ? 'white' : 'black',color: theme === 'light' ? 'black' : 'white',};return (<div style={styles}><p>ChildComponent</p><button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>{theme === 'light' ? '切换黑色主题' : '切换亮色主题'}</button></div>);
}

在这两个文件中,我们使用 useTheme Hook 获取当前的主题状态和更新主题的方法,并根据主题状态动态设置样式。

应用入口

最后,在 App.tsx 中引入 Test 组件,作为应用的入口。

App.tsx

// src/App.tsx
import Test from "./components/useContext/Test";function App() {return <Test />;
}export default App;

总结

通过以上步骤,我们成功地使用 useContext 实现了一个简单的主题切换功能。useContext 提供了一种简洁的方式来共享全局状态,避免了通过多层 props 传递的状态管理问题。这种方式不仅提高了代码的可维护性,还使得状态管理更加直观和灵活。

希望这篇文章能帮助你更好地理解 useContext 的使用方法,并为你的 React 项目带来更多的灵感和便利。如果你有任何问题或建议,欢迎留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

气膜料仓:工业仓储的高效与安全新选择—轻空间

在工业仓储领域&#xff0c;如何实现高效、安全、环保的存储方式成为企业关注的重点。气膜料仓以其独特的无梁无柱设计和智能化功能&#xff0c;为工业仓储带来了全新的解决方案。 空间利用率高&#xff1a;无障碍的大容量仓储 气膜料仓内部无梁无柱&#xff0c;形成了完全开…

Windows FileZila Server共享电脑文件夹 映射21端口外网连接

我有这样一个使用场景&#xff0c;在外部网络环境下&#xff0c;通过手机便捷地读取存储在电脑上的视频文件。比如在外出旅行、出差&#xff0c;身边没有携带电脑&#xff0c;仅依靠手机设备&#xff0c;就能随时获取电脑里存储的各类视频&#xff0c;无论是学习资料视频、工作…

CentOS部署FastDFS+Nginx并实现远程访问本地服务器中文件

文章目录 前言1. 本地搭建FastDFS文件系统 1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址…

2023年江西省职业院校技能大赛网络系统管理赛项(Linux部分样题)

一、Linux项目任务描述 你作为一个Linux的技术工程师,被指派去构建一个公司的内部网络,要为员工提供便捷、安全稳定内外网络服务。你必须在规定的时间内完成要求的任务,并进行充分的测试,确保设备和应用正常运行。任务所有规划都基于Linux操作系统,请根据网络拓扑、基本配…

【Spring】定义的Bean缺少隐式依赖

问题描述 初学 Spring 时&#xff0c;我们往往不能快速转化思维。例如&#xff0c;在程序开发过程中&#xff0c;有时候&#xff0c;一方面我们把一个类定义成 Bean&#xff0c;同时又觉得这个 Bean 的定义除了加了一些 Spring 注解外&#xff0c;并没有什么不同。所以在后续使…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…

不用编程即可实现多台PLC的MQTT协议JSON文件发布与订阅的智能网关的配置说明

IGT-SER系列智能网关支持各种PLC的以太网和串口协议&#xff0c;以及Modbus、OPC通讯&#xff0c;通过网关所带的参数配置工具软件&#xff0c;不用编程&#xff0c;即可打包和解析JSON格式的设备数据&#xff0c;通过MQTT、HTTP等协议发布和订阅。相关案例 IGT-SER系列智能网关…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

ARCGIS国土超级工具集1.3更新说明

ARCGIS国土超级工具集V1.3版本&#xff0c;功能已增加至49 个。在V1.2的基础上修复了若干使用时发现的BUG&#xff0c;完善了部分已有的功能&#xff0c;新增了“面要素狭长面检测分割”等功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新土地分类面积表…

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代&#xff0c;网站作为企业和个人展示信息、提供服务的重要窗口&#xff0c;其重要性不言而喻。而 Portal 页&#xff0c;作为网站的核心页面之一&#xff0c;承担着引导用户、整合信息等关键任务。那么&#xff0c;如何使用 HTML 开发一个功能齐全、界面…

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时&#xff0c;原本项目能够正常启动。但在后续编写代码并重建项目后&#xff0c;再次尝试运行却出现了 “错误&#xff1a;找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…