useContext:React Hooks

usecontext:react hooks

react 中的 usecontext 和两个实用的迷你项目

介绍

在 react 中,管理组件之间的数据至关重要,尤其是在多个组件需要访问相同数据的大型应用程序中。 prop 钻取(将 props 传递到组件树的多个级别)很快就会变得很麻烦。这就是 react 的 usecontext hook 的闪光点。 usecontext 允许您跨组件共享数据,而无需手动传递 props,这使其成为状态管理的宝贵工具。

在本文中,我们将首先详细解释 usecontext、其语法及其优点。然后,我们将通过构建两个迷你项目来巩固这种理解:

主题切换器:一个简单的主题切换器,用于展示 usecontext 如何管理全局状态。用户身份验证状态:处理用户登录状态的应用程序,演示如何在实际用例中使用 usecontext。

在本教程结束时,您将具备在任何 react 项目中自信地使用 usecontext 的能力。

什么是usecontext?

usecontext 的基础知识

usecontext 是一个 react hook,允许组件直接订阅上下文。它使组件能够从组件树中位于其上方的最近的提供程序访问全局数据,从而有助于避免 prop 钻取的麻烦。

usecontext 的语法

以下是创建和使用上下文的基本语法:

import react, { usecontext, createcontext } from 'react';const mycontext = createcontext(defaultvalue); // step 1: create a contextfunction mycomponent() {    const contextvalue = usecontext(mycontext); // step 2: use the context    return 
{contextvalue}
;}

解释

创建上下文:createcontext 初始化一个上下文对象,该对象保存我们要共享的数据。 defaultvalue 参数是可选的,但如果没有找到 provider,可以用作后备参数。通过 usecontext 使用上下文:在组件内部,我们使用 usecontext(mycontext) 来访问上下文的当前值。该值由组件树中该组件上方最近的 确定。

上下文提供者和消费者的示例

import react, { usecontext, createcontext } from 'react';const themecontext = createcontext('light'); // default theme is lightfunction themeprovider({ children }) {    return {children};}function displaytheme() {    const theme = usecontext(themecontext); // consuming the context    return 

the current theme is {theme}

;}function app() { return ( );}

在此示例中:

themecontext 是我们的上下文,使用默认值“light”进行初始化。themeprovider 包装 displaytheme 并提供 value=”dark”,使“dark”成为 themeprovider 中的当前主题。displaytheme 组件使用 usecontext(themecontext) 来访问主题并渲染它。

这涵盖了基础知识。现在,让我们深入研究项目,将这些知识应用到实际场景中。

迷你项目 1:构建主题切换器

我们的第一个项目是一个简单的主题切换器,它将演示如何使用 usecontext 来管理主题的全局应用程序状态。

第 1 步:设置上下文

import react, { createcontext, usecontext, usestate } from 'react';const themecontext = createcontext();export function themeprovider({ children }) {    const [theme, settheme] = usestate('light');    const toggletheme = () => settheme(theme === 'light' ? 'dark' : 'light');    return (                    {children}            );}

这里,themecontext 提供两个值:当前主题和切换它的函数。提供程序包装应用程序组件,使主题和切换功能全局可用。

第 2 步:使用组件中的上下文

function themetoggler() {    const { theme, toggletheme } = usecontext(themecontext); // access context values    return (            );}function displaytheme() {    const { theme } = usecontext(themecontext);    return 

current theme: {theme}

;}

第 3 步:在主应用程序中使用提供程序

function app() {    return (                                            );}export default app;

现在,您可以通过单击按钮在浅色和深色主题之间切换,主题状态会显示在旁边。该项目演示了 usecontext 如何允许多个组件共享全局状态更改并对全局状态更改做出反应。

迷你项目 2:管理用户身份验证

对于第二个项目,让我们构建一个简单的应用程序,使用 usecontext 跟踪用户的身份验证状态。

第 1 步:创建身份验证上下文

import react, { createcontext, usecontext, usestate } from 'react';const authcontext = createcontext();export function authprovider({ children }) {    const [isauthenticated, setisauthenticated] = usestate(false);    const login = () => setisauthenticated(true);    const logout = () => setisauthenticated(false);    return (                    {children}            );}

第2步:创建登录和注销组件

function loginbutton() {    const { login } = usecontext(authcontext); // access login function    return ;}function logoutbutton() {    const { logout } = usecontext(authcontext); // access logout function    return ;}

步骤3:显示用户状态

function userstatus() {    const { isauthenticated } = usecontext(authcontext);    return (        

{isauthenticated ? 'welcome back!' : 'please log in.'}

);}

第 4 步:在应用程序中组合组件

function App() {    return (                                                        );}export default App;

现在,您有一个简单的身份验证状态应用程序,其中登录和注销按钮可以更新应用程序中的用户状态。该项目演示了 usecontext 如何在现实场景中处理应用程序的状态。

结论

通过这两个项目,您已经了解了 usecontext 如何简化组件之间的数据共享,而无需进行 prop 钻取。主题切换器和身份验证状态项目为有效管理全局状态提供了实用的见解。无论您是切换主题还是处理用户身份验证,usecontext 都提供了一个强大的工具来构建高效且有组织的应用程序。

以上就是useContext:React Hooks的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1496702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 18:50:05
下一篇 2025年12月19日 18:50:16

相关推荐

  • 使用 Chrome 扩展移除或替换 Google Ads

    本文旨在指导开发者通过 Chrome 扩展移除或替换网页中的 Google Ads。针对使用 Google Publisher Tag (GPT) 和 Adsense 的两种情况,分别提供了相应的 JavaScript 代码示例。同时,本文还提供了完整的 Chrome 扩展代码,包括 manifes…

    2025年12月20日
    000
  • 如何通过Chrome扩展程序替换Google广告内容

    本文旨在详细阐述如何开发Chrome扩展程序,以检测并替换网页中的Google广告(包括Google Ad Manager和AdSense),将其替换为自定义内容。教程将涵盖识别广告元素的DOM操作技巧、Chrome扩展程序的Manifest V3配置、背景脚本的注入逻辑,以及如何利用Google …

    2025年12月20日
    000
  • 使用 Chrome 扩展替换 Google Ads

    本文介绍如何通过 Chrome 扩展程序,利用 Google Publisher Tag (GPT) 和 Adsense 的特性,定位并替换网页中的 Google 广告。教程详细讲解了如何通过 JavaScript 代码实现广告位的查找与替换,并提供了完整的 Chrome 扩展程序示例,包括 man…

    2025年12月20日
    000
  • 在Chrome扩展中替换Google广告内容的技术指南

    本教程详细阐述了如何在Chrome扩展中识别并替换网页上的Google广告内容。文章涵盖了针对Google Ad Manager (GPT) 和 AdSense 两种主要广告类型的处理方法,并深入探讨了在Chrome扩展中通过脚本注入实现此功能的关键技术,包括 manifest.json 配置、后台…

    2025年12月20日
    000
  • 什么是状态机?有限状态机的实现

    有限状态机常见实现方式有:基于枚举和switch/case语句,适合简单场景但难以维护;状态模式通过封装状态类提升扩展性但类数量增多;状态转换表以表格形式清晰表达转换规则但规模大时复杂;基于框架或库如Spring Statemachine可支持高级功能。选择方式需根据复杂度和需求权衡。 状态机,简单…

    2025年12月20日
    000
  • js 怎样处理鼠标滚轮事件

    最推荐的方式是监听wheel事件。它提供deltaY、deltaX和deltaMode属性,能精确获取滚动方向与幅度,通过preventDefault()阻止默认行为并结合{passive: false}实现自定义滚动,现代浏览器支持良好,优于旧的mousewheel和DOMMouseScroll事…

    2025年12月20日
    000
  • js 怎么发送AJAX请求

    最现代且推荐的ajax请求方式是使用fetch api,1. 它基于promise,语法简洁,支持async/await,2. 可通过配置对象发送get/post请求并自定义请求头,3. 需手动检查response.ok处理http错误,4. 使用abortcontroller结合promise.r…

    2025年12月20日
    000
  • js如何实现页面平滑滚动

    实现页面平滑滚动主要有两种方式:一是使用javascript的scrollintoview({ behavior: ‘smooth’ })方法,简单高效,适用于大多数现代浏览器;二是结合requestanimationframe与window.scrollto()手动实现,可…

    2025年12月20日
    000
  • JS如何实现单向数据流

    单向数据流在js中的核心实现是通过“数据向下传递,事件向上冒泡”的模式,即父组件通过props将数据传给子组件,子组件通过事件或回调通知父组件修改状态,从而保证数据流向的清晰与可预测;在复杂场景中,采用中心化状态管理(如redux模式),通过定义全局状态、不可变更新的reducer函数、dispat…

    2025年12月20日
    000
  • js怎么实现屏幕录制

    屏幕录制可通过mediarecorder和getdisplaymedia api实现;2. 麦克风权限应先请求屏幕共享,再单独请求音频以避免多次弹窗;3. 优化文件大小可降低分辨率、帧率,选择vp9编码或限制时长;4. 添加水印可用canvas api绘制并捕获流,或录制后用ffmpeg.js处理;…

    2025年12月20日 好文分享
    000
  • js 怎样实现语音识别

    javascript实现语音识别的核心是web speech api,包含speechrecognition(语音转文字)和speechsynthesis(文字转语音)两部分;2. 使用前必须检测浏览器支持,通过if (‘webkitspeechrecognition’ in…

    2025年12月20日
    000
  • js如何实现文件上传

    文件上传的核心是通过input[type=”file”]获取文件,使用formdata封装,再通过xhr或fetch发送;2. 进度显示依赖xhr的upload.onprogress事件,取消上传可通过调用abort()方法实现;3. 前端校验文件类型可检查file.type…

    2025年12月20日
    000
  • js 怎样制作工具提示

    javascript制作工具提示的核心是监听鼠标事件并动态操作dom;2. 实现需结合html、css和javascript,通过mouseover和mouseout事件控制提示的显示与隐藏;3. 工具提示应挂载到body上以避免定位限制,并使用getboundingclientrect计算位置;4…

    2025年12月20日
    000
  • JS如何实现Diff算法

    javascript中的diff算法通过比较新旧虚拟dom树,找出最小差异并更新真实dom。1. 只进行同层节点比较,不跨层级对比;2. 节点类型不同时直接替换;3. 类型相同时比较属性,增删或更新不一致的属性;4. 子节点比较中,无key时按顺序对比,有key时通过key识别同一节点,实现复用与移…

    2025年12月20日
    000
  • JS如何实现策略模式

    策略模式通过封装算法使其可互换,JavaScript中利用函数作为一等公民实现,适用于表单验证等场景,结合工厂模式提升灵活性,但应避免过度设计。 策略模式的核心在于定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。这使得算法可以在不影响客户端的情况下发生变化。在JS中,这可以通过函数作为一…

    2025年12月20日
    000
  • js怎样实现分页功能

    客户端分页适用于数据量较小(如几百到几千条)的场景,所有数据预先加载到浏览器,通过javascript切分显示,切换页面无网络延迟,适合数据变动少、追求流畅体验的内部系统或小型页面;2. 服务器端分页适用于大数据量(如成千上万条)的场景,每次请求只获取当前页数据,减轻浏览器负担,确保性能和可扩展性,…

    2025年12月20日 好文分享
    000
  • JS如何实现this绑定?this的指向规则

    JavaScript中this的指向遵循五种核心规则:1. new绑定优先级最高,this指向新创建的实例;2. 显式绑定通过call、apply或bind方法强制指定this值;3. 隐式绑定发生在对象方法调用时,this指向调用该方法的对象;4. 箭头函数采用词法绑定,this继承外层作用域的t…

    2025年12月20日
    000
  • 基于复选框实现HTML元素动态显示与隐藏的教程

    本文详细介绍了如何利用JavaScript(特别是jQuery库)和HTML,实现基于复选框状态动态显示或隐藏页面上的特定HTML元素。教程涵盖了基本的实现方法、代码示例,并探讨了如何优化代码结构、提升用户体验及考虑其他前端框架提供的解决方案,旨在帮助开发者构建更具交互性的Web界面。 1. 概述与…

    2025年12月20日
    000
  • 实现HTML元素基于复选框状态的动态显示与隐藏教程

    本教程详细介绍了如何利用HTML复选框和JavaScript(特别是jQuery库)实现页面元素的动态显示与隐藏。通过监听复选框的选中状态变化,可以灵活控制不同内容区域的可见性,实现诸如“上传文件”与“输入链接”等互斥功能的切换,从而显著提升用户界面的交互性和体验。 引言 在现代web应用开发中,动…

    2025年12月20日
    000
  • 动态切换HTML内容:基于复选框状态的显示与隐藏技术

    本文旨在详细阐述如何利用HTML复选框的状态变化,通过JavaScript(尤其是jQuery)动态控制页面上不同HTML区域的显示与隐藏。文章将涵盖从单一元素的切换到多个互斥区域的显示逻辑,提供清晰的代码示例,并探讨相关注意事项与最佳实践,以帮助开发者提升用户界面的交互性和灵活性。 核心概念:基于…

    2025年12月20日 好文分享
    000

发表回复

登录后才能评论
关注微信