React Context 快速使用

使用TypeScript并升级到React 18 为了支持React 18,React类型定义进行了升级,其中包含了一些break change。本文将讲述在TypeScript中如何升级到React 18 阅读详情

1 使用背景

为了跨组件进行数据传递,尤其是跨多级组件传递,使用context能简化流程,且更为清晰。需要注意的是,依赖context的组件,在context发生改变的时候会更新(不受shouldComponentUpdate控制)
需要注意的是:context比较为浅比较,如果父组件传递给子组件的context是一个新对象,则会触发子组件更新。

2 类组件使用

注意:context一定要单独存放,否则可能会有引用问题,导致无法找到context,即import加载顺序

  1. 声明context
// context.js
import React from 'react';
export const NameContext = React.createContext("xxx");
  1. 在父组件上使用Provider
// App.js
import React from "react";
import Page01 from "./routes/page01";
import { NameContext } from "./context/Context";
// export const NameContext = React.createContext("xxx"); 不要在这里创建context,需要放在单独的文件里
function App() {
  return (
    <NameContext.Provider value="xiaopi3">
      <div>
        <h1>这是一个APP!</h1>
        <Page01 />
      </div>
    </NameContext.Provider>
  );
}

export default App;
  1. 在需要使用的组件中,声明contextType,即可使用this.context
// Page01.js
import React, { Component } from 'react'
import {NameContext} from '../../context/Context';

export default class Page01 extends Component {
  static contextType =  NameContext;
  render() {
    return (
      <div>
          <h1>当前是一个测试页面Page01!</h1>
          <div>{this.context}</div>
      </div>
    )
  }
}

一般而言如果需要传入改变context的方法,需要将其值和方法作为一个对象传递给provider的value(注意:value为浅比较,如果引用未改变则不会更新页面,所以此处使用类的state,因为调用setState后会生成一个新的state)

// App.js
import React from "react";
import Page01 from "./routes/page01";
import { NameContext } from "./context/Context";

class App extends React.Component {
  state = {
    name: "xxx",
    changeName: (name) => this.setState({ name }),
  };
  render() {
    return (
      <NameContext.Provider value={this.state}>
        <div>
          <h1>这是一个APP!</h1>
          <Page01 />
        </div>
      </NameContext.Provider>
    );
  }
}

export default App;

使用的时候:this.context.changeName('pp')即可。

3 函数组件使用

和类组件不同,函数组件无需声明contextType,但需要在render中使用consumer:

// 类组件
static contextType =  NameContext;
...
<div>{this.context}</div>
// 函数组件
import React from "react";
import { NameContext } from "../../../context/Context";

export default function Cp01() {
  return (
    <>
      我是N代子组件
      <NameContext.Consumer>
        {(context) => (
          <>
            <div>{context.name}</div>
            <button onClick={()=>context.changeName("pp")}>changeName</button>
          </>
        )}
      </NameContext.Consumer>
    </>
  );
}

注意:Context.Consumer内部需要一个函数作为子元素!接收当前context值,并返回react节点。

4 消费多个context

如果组件需要消费多个context,需要使用consumer来进行嵌套,同时传递value时也需要嵌套!

// provider嵌套
<ThemeContext.Provider value={theme}>
  <UserContext.Provider value={signedInUser}>
    <Layout />
  </UserContext.Provider>
</ThemeContext.Provider>

// consumer嵌套
<ThemeContext.Consumer>
  {theme => (
    <UserContext.Consumer>
      {user => (
        <ProfilePage user={user} theme={theme} />
      )}
    </UserContext.Consumer>
  )}
</ThemeContext.Consumer>

5 useContext

注意事项同非hook方式一样,在context更新时,该hook会触发组件重新渲染,即使父组件使用了React.memo或shouldComponentUpdate。

该hook接收context:useContext(MyContext) 相当于 class 组件中的 static contextType = MyContext 或者 <MyContext.Consumer>
注意:useContext(MyContext) 只是让你能够读取 context 的值以及订阅 context 的变化。你仍然需要在上层组件树中使用 <MyContext.Provider>来为下层组件提供 context。

使用hook改写部分代码:

// hook方式
import React,{useContext} from "react";
import { NameContext } from "../../../context/Context";

export default function Cp01() {
  const context = useContext(NameContext);
  return (
    <>
      Cp01
      <div>{context.name}</div>
      <button onClick={() => context.changeName("pp")}>changeName</button>
    </>
  );
}

Office 365中的Assigned Access详细功能介绍 本文系统介绍了Office365中AssignedAccess功能的应用与管理。作为Windows系统的重要安全特性,AssignedAccess可将设备锁定为单应用模式,有效防范未授权访问。文章详细阐述了其核心功能、技术架构及配置方法,包括UWP/Win32应用支持、多用户配置、与AzureAD集成等。通过MicrosoftEndpointManager可实现批量部署和远程监控,适用于公共终端、零售设备等场景。该功能为企业数字化转型提供了安全、可控的终端管理方案,在保障数据安全的同时优化用户体验。 阅读详情

相关推荐

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5728

React中Provider组件详解

使用场景 1.A(顶级组件)-》B组件(子组件)-》C组件(孙子组件) 2.A(顶级组件)-》B组件(子组件)、C组件(孙子组件)…很多组件(每个组件都需要传props) A组件传递数据给C组件实现方式有很多种 1.通过props层层传递到C组件 2.通过全局对象 使用Provider可以解决数据层层传递和每个组件都要传props的问题; 三个嵌套组件:A B C 场景:组件 C 想要取组件A 的属性,一般做法通过A–B–C一层一层传递下来 缺点:使用麻烦,容易出错,中途出错,后续都错 class A ex

zai329979994639的博客 1万+

平行趋势检验没通过怎么办?别慌,试试三重差分DDD与事件研究法

本文探讨了当平行趋势检验未通过时,如何运用三重差分法(DDD)与事件研究法进行政策评估。通过Stata代码示例和实战案例,详细介绍了DDD的原理、适用场景及实现步骤,并提供了替代方案如合成控制法和匹配DID,帮助研究者获得更准确的因果推断结果。

weixin_28732953的博客 609

使用 React.Provider 提供泛型的上下文

通过这种方式,你可以创建一个通用的Provider组件,它可以为不同的类型提供上下文,而不必为每个类型创建一个新的Provider。在这个例子中,someValue是一个字符串,但它可以是任何类型,因为Provider组件的value prop是泛型的。在React.Provider中使用泛型可以帮助你创建可复用的上下文提供者,而不必为每个上下文类型编写新的提供者组件。在这个组件中,T是你在上下文定义中使用的类型参数。最后,你可以在你的应用的根组件中使用MyProvider来提供上下文。

AigcFox的博客 1813

第五节 Amesim《直动型溢流阀HCD建模》HCD5 学习资料

利用HCD原则创建直动型溢流阀的界面。这可能包括图形化表示直动型溢流阀的工作原理、操作方式和调节方法。这样的界面应当直观且易于理解,使用户能够轻松了解阀门的功能和使用方法。

m0_58052642的博客 1330

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9695

react-redux provider组件

react-redux provider组件 在src/index.js中使用 provider组件的作用 provider包裹在根组件外层,使所有的子组件都可以拿到state。 它接受store作为props,然后通过context往下传,这样react中任何组件都可以通过context获取store。 import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './

qq_42693392的博客 1774

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 201

React中使用Context的3种方式

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的(例如:地区偏好,UI 主题),这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。Context提供了一个局部的全局作用域,使用Context则无需再手动的逐层传递props。

qq_39650208的博客 2779

编写python脚本调用ordinals以及BRC20的接口

1、钱包地址生成walletreceive,对应ord命令:ord wallet receive。6、测试手动出块generate,这个只在regtest链节点用得上。所有接口都是post请求,采用postman进行测试。4、测试bitcoin转币sendtoaddress。7、测试其他的wallet方法wallet。2、钱包币种铭刻inscription,对应bitcoin-cli命令。对应bitcoin-cli命令。对应bitcoin-cli命令。fee.json文本模板。还可以加很多根据需要加减。

云深海阔专栏 1047

15、分布式查询处理详解

本博文深入探讨了分布式环境下的查询处理与优化技术。从查询处理的基本概念出发,分析了在分布式系统中执行查询所面临的额外挑战,并通过实例比较了不同的执行策略。文章详细介绍了查询优化的组成要素,包括搜索空间、成本模型和搜索策略,同时涵盖了查询处理的多个层次以及数据本地化的核心方法。此外,还讨论了连接排序优化、分布式成本模型以及多种查询优化方法,如静态优化、动态优化和混合优化。最后,提出了自适应查询处理的概念,旨在提高分布式查询的灵活性和效率。通过综合应用这些技术,可以有效提升分布式数据库的查询性能,降低通信和计算

gan8painter的博客 73

react Provider、Consumer原理解析

Context 状态管理 在fiber树创建过程中, 如果使用了Context api(具体来说是使用Context.Provider,Context.Consumer,Class.contextType等api), react内部会维护一个栈来保存提供者(Context.Provider)的状态, 供给消费者(Context.Consumer)使用 export type StackCursor<T> = {| current: T |}; // 维护一个全局stack const va

weixin_43294560的博客 3885

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

React跨组件-Context快速上手

简单理解下单词的意思 Provider:提供者 Consumer:消费者(函数式组件使用) 先创建跨组件共享的Context(上下文),就是即将共享给其他组件的内容保存的地方(比如全局主题的颜色),它不受限组件的层级嵌套深度,兄弟,爷孙,父子等都可用。 const UserContext = React.createContext({ nickName:'我是默认值', level:-1 }) React官网的创建例子:const ThemeContext = React.createCo

qq_43269642的博客 310

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何快速上手 React Native Safe Area Context:5分钟入门教程

React Native Safe Area Context 是一个灵活的 JavaScript 库,专为处理移动应用中的安全区域内边距而设计,同时支持 Android 和 Web 平台。无论你是 React Native 新手还是有经验的开发者,本教程都能帮助你在短短5分钟内掌握其核心用法,让你的应用界面完美适配各种设备屏幕。 [![React Native Safe Area Context

gitblog_00572的博客 635

React Shallow Context 使用教程

React Shallow Context 使用教程 1、项目介绍 react-shallow-context 是一个用于优化 React Context API 性能的开源项目。它通过实现 calculateChangedBits 来优化 React 对 Context 更新的反应方式,类似于 shouldComponentUpdate 或 PureComponent。这个项目的主要目标是减少不...

gitblog_00384的博客 507

React Context Devtool 使用指南

React Context Devtool 使用指南 项目介绍 React Context Devtool 是一个专为 React 应用设计的调试工具,它支持React的ContextAPI以及useReducer Hook。此工具通过提供树状视图、原始数据视图和差异视图来帮助开发者直观地观察和理解Context值的变化。此外,它还允许在开发模式下调试useReducer的状态变化并直接从Devt...

gitblog_00440的博客 644

使用react的好处_React Context(上下文) 作用和使用 看完不懂 你打我

日常记录一下学习到的知识点吧。好记性不如烂笔头~ 我相信这是对的。官方文档 的demo已经很棒了。但我觉得我的描述会让你更容易理解。自己无聊倒腾了小程序 欢迎大家测试使用~gh_af88ca3ac9c4_430.jpg1.ContextContext 通过组件树提供了一个传递数据的方法,从而避免了在每一个层级手动的传递 props 属性。有部分小伙伴应该使用props属性进行组件向下传值的操作。当...

weixin_30983353的博客 625

使用Ant Design的`create-react-context`库教程

使用Ant Design的create-react-context库教程 1. 项目介绍 create-react-context 是一个React的polyfill库,用于实现React提议中的Context API。它提供了创建和使用上下文(Context)的功能,使得数据可以在组件树中深层传递而无需显式地一层层传递props。这个库特别适用于需要在多个层级之间共享状态或者配置的情况。 2. ...

gitblog_00813的博客 805

React OIDC Context 开源项目使用教程

本教程旨在引导您了解并快速上手 [react-oidc-context](https://github.com/authts/react-oidc-context.git) 这一开源库,它简化了在React应用中集成OpenID Connect(OIDC)身份验证的过程。我们将从项目的基本结构到核心文件的使用进行详细介绍。 ## 1. 项目目录结构及介绍 ``` react-oidc-cont

gitblog_00349的博客 1077

前端框架react----Context实例

目录 前言 一、复习Context 二、深浅主题切换案例 前言 在之前的文章中也介绍过Context,本次文章简单复习一下,并且以实例来理解Context。 一、复习Context 我们知道,在JS中context指的是函数的执行上下文,函数被调用时,this指向谁,谁就是当前的执行上下文; react中的context是什么呢?官方文档给出: Context 通过组件树提供了一个传递数据的方法,从而避免了在每一个层级手动的传递 props 属性。 文档也没具体给出context到底是什

我睡觉的时候不困 485

【亲测免费】 基于react-oidc-context项目的常见问题解决方案

`react-oidc-context` 是一个轻量级的认证库,基于 `oidc-client-ts` 库为 React 单页应用程序(SPA)提供认证支持。该库支持 React 钩子(hooks)和高阶组件(HOC),使得在 React 应用中集成 OpenID Connect(OIDC)认证变得更加简单。 主要编程语言:JavaScript(TypeScript) ## 新手常见问题及解决

gitblog_00351的博客 1045

react初探-context

最近公司上开始用react了,以前我的技术栈都是vue相关的,所以得赶紧学起来了,记录一下学习react中碰到的问题。 在项目上使用到了Context进行组件的数据传递,感觉有点意思,特此记录一下使用方法 概念及应用 context设计目的是为了共享那些对于一个组件树而言是“全局”的数据。比如你在父组件创建一个数据,则在其后代所有的组件中都可以访问的到。 用法 知道基本的概念后就好理解了 contex.js import React from "react"; export const MyCont.

laishaojiang的博客 192

React 示例项目教程

React 示例项目教程 项目介绍 react-by-sample 是一个由 Lemoncode 维护的开源项目,旨在通过一系列的示例代码来指导开发者理解和掌握 React 和 TypeScript 的基本概念和高级特性。该项目包含了从基础到高级的多个示例,每个示例都旨在展示 React 的某个特定功能或最佳实践。 项目快速启动 克隆项目 首先,克隆项目到本地: git clone https:/...

gitblog_01168的博客 390

react使用语法

react使用语法

huihui_999的博客 143

React Native:快速熟悉react 语法和企业级开发

本文为React实战教程,面向有前端基础的开发者,通过8个核心概念和示例讲解React应用开发。内容涵盖:1)JSX语法实现电商商品卡片;2)State与Props实现表格分页;3)事件处理实现登录表单;4)条件渲染处理消息列表;5)Context API管理主题切换;6)useState实现计数器与表单;7)useEffect实现文章列表加载;8)useContext优化用户状态管理。教程使用Vite+Ant Design技术栈,包含代码优化建议和常见问题解决方案,帮助开发者快速掌握React业务组件开发

shunzi2016的博客 1197

use-mcp:3分钟快速上手AI应用开发的React Hook

想要快速为你的React应用添加AI能力?**use-mcp**正是你需要的轻量级解决方案。这个React Hook让你能够轻松连接遵循Model Context Protocol (MCP)标准的AI系统,无需复杂的配置即可实现智能对话、工具调用和资源访问功能。 ## 为什么选择use-mcp? **use-mcp**是连接AI系统的桥梁,它简化了与MCP服务器的交互流程,让你专注于业务逻辑

gitblog_00824的博客 1037
上一篇: JavaScript高级
下一篇: 我的typescript学习心得
天落枫
博客等级 码龄10年 91粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值