React学习笔记(八)context

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例 本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。 阅读详情

在使用组件化开发的时候,我们往往会遇到组件间传递数据的问题,如果一个数据需要从组件树的顶端传递到底端,且两个组件之间有非常多的组件,那我们要通过props来一级一级传递就相当麻烦了,所以在React中,我们可以使用context来为一个组件树创建一个“全局的变量”。

context的基本使用


// 创建一个context
// light为默认值
const ThemeContext = React.createContext('light');

class App extends React.Component {
  render() {
    return (
      // 通过provider在顶部组件使用context将值传递下去
      // value为要传递的值
      <ThemeContext.Provider value="dark">
        <Toolbar />
      </ThemeContext.Provider>
    );
  }
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

class ThemedButton extends React.Component {
  // 将context指向ThemeContext
  static contextType = ThemeContext;
  render() {
    // 调用context
    return <Button theme={this.context} />;
  }
}
class Button extends React.Component{
    render(){
        return(
        <button>{this.props.theme}</button>
        )
    }
}

上面的例子中,我们在全局使用React.createContext创建了一个context,通过在顶部组件App使用provider来将context的值传递下去,在子组件中通过使用contextType来将当前组件的context指向自己定义的context,然后使用this.context来获取值。

API


React.createContext
const MyContext=React.createContext('default');

React.createContext是用于创建一个context对象的方法,当React的一个组件订阅了一个context后,会往上找到最近的该context的provider的值。当没有找到provider时,括号内的默认值就会被读取到。
我们将上面的代码修改一下

const ThemeContext = React.createContext('light');

class App extends React.Component {
  static contextType=ThemeContext;
  render() {
    return (
      // 通过provider在顶部组件使用context将值传递下去
      // value为要传递的值
      <ThemeContext.Provider value="dark">
        <Toolbar />
        <Button theme={this.context}/>
      </ThemeContext.Provider>
    );
  }
}

在App组件中添加一个Button组件,将App组件的contextType指向ThemeContext,将this.context赋值给Button组件的theme属性,发现页面上多了一个light的按钮
在这里插入图片描述
这就是因为App组件上面已经没有Provider了,所以会使用默认值"light"。
即便是传递一个undefined给一个provider,也不会触发默认值。

Context.Provider
<MyContext.Provider value="val">
	// ...
</MyContext>

Context.Provider用于设置要往下传递的Context的值,Context为我们自定义的context的名字,value为我们要传递下去的值,使用多个Context.Provider的时候,因为订阅的组件会往上找最近的Context.Provider,所以里层的Context.Provider会覆盖外层的
当Context.Provider的value发生变化时,订阅的组件也同样会发生变化
修改一下上面的例子

const ThemeContext = React.createContext('light');

class App extends React.Component {
  constructor(props){
      super(props);
      this.state={
          themeVal:"dark"
      }
      this.clickBtn=this.clickBtn.bind(this);
  }
  clickBtn(){
    this.setState({
        themeVal:"white"
    })
  }
  static contextType=ThemeContext;
  render() {
    return (
      // 通过provider在顶部组件使用context将值传递下去
      // value为要传递的值
      <ThemeContext.Provider value={this.state.themeVal}>
        <Toolbar />
        <button onClick={this.clickBtn}>btn</button>
      </ThemeContext.Provider>
    );
  }
}

这里将state里的值赋值给ThemeContext的value,增加一个按钮来修改该value值,当没有点击的时候
在这里插入图片描述
点击之后
在这里插入图片描述
发现子组件按钮中的dark变成了white,实际上,我们可以把这个看成是订阅-发布,子组件订阅了context,当context的值发生变化时,就会将内容发布给订阅了的子组件,这些子组件就会相应地修改值
tip:context.Provider不会生成具体的元素,但是可以在react-devtools看到

class.contextType

React通过class.contextType可以将this.context指向React.createContext()创建的context对象,可以在生命周期的任何位置调用this.context获取对应的context对象

class MyClass extends React.Component {
  componentDidMount() {
    let value = this.context;
    /* 在组件挂载完成后,使用 MyContext 组件的值来执行一些有副作用的操作 */
  }
  componentDidUpdate() {
    let value = this.context;
    /* ... */
  }
  componentWillUnmount() {
    let value = this.context;
    /* ... */
  }
  render() {
    let value = this.context;
    /* 基于 MyContext 组件的值进行渲染 */
  }
}
MyClass.contextType = MyContext;

使用该API只能订阅一个context对象

Context.Consumer
<MyContext.Consumer>
	{value=>{
		return(
		// ...
		)
	}}
</MyContext.Consumer>

Context.Consumer可以获取最近的Provider的值,如果没有的话就使用默认值,value为获取的值,可以通过该值来进行渲染。
修改上面的代码

const ThemeContext = React.createContext('light');

class App extends React.Component {
  render() {
    return (
      // 通过provider在顶部组件使用context将值传递下去
      // value为要传递的值
      <ThemeContext.Provider value="dark">
        <Toolbar />
      </ThemeContext.Provider>
    );
  }
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
      <ThemeContext.Consumer>
          {value=>{
              return(
                  <p>{value}</p>
              )
          }}
      </ThemeContext.Consumer>
    </div>
  );
}

页面显示
在这里插入图片描述

mmsegmentation教程1:自定义数据集、config文件修改、训练教程 mmseg使用教程 阅读详情

相关推荐

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 430

React中的组件通信——父传子、子传父、Context

0、认识组件间的通信 在开发过程中,我们会经常遇到需要组件之间相互进行通信: 比如App可能使用了多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递给Header一些数据,让其进行展示; 又比如我们在Main中一次性请求了Banner数据和ProductList数据,那么就需要传递给他们来进行展示; 也可能是子组件中发生了事件,需要由父组件来完成某些操作,那就需要子组件向父组件传递事件; 总之,在一个React项目中,组件之间的通信是非常重要的环节; 父组件在展示子组件

zep 5280

在MacBook上直接跑Windows Server 2022:一个开发者的真实踩坑与配置全记录

本文详细记录了在MacBook上原生运行Windows Server 2022的完整流程与优化技巧。通过Boot Camp实现非虚拟机安装,开发者可以充分利用Mac硬件性能,搭建高效的本地开发环境,特别适合需要测试跨平台应用和服务器功能的场景。文章涵盖驱动处理、分区策略、Docker配置等关键步骤,为技术极客提供实用指南。

weixin_42620913的博客 247

React 组件之间的通信(context上下文对象)

react 组件之间的通信(父子组件)

m0_48757492的博客 346

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3596

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 501

React_Context(组件通讯)

Context(组件通讯)

weixin_47586598的博客 204

为什么一个“时间片”能折腾 Linux 十年?

时间片扩展不是抢占调度器的控制权,也不是提升优先级。在“非常短暂、非常确定”的用户态临界区内,避免线程被不必要地抢占。用户态自旋锁(user-space spinlock)无系统调用的极短临界区高并发、低延迟的数据结构操作RSEQ(Restartable Sequences)保护区间一旦线程在临界区被抢占,系统整体性能反而下降。线程 A 拿着一个用户态锁线程 B 被调度上来,开始自旋等这个锁但 A 因为时间片用完,被调度器切走CPU 白白空转,所有线程都在浪费时间。

网络技术联盟站 256

react中Context实现跨组件传递数据

react中Context实现跨组件传递数据

qq_37967853的博客 516

Vibe Coding 工具实战案例全解:Cursor、Claude Code、Codex 真实项目 30 分钟到 4 小时快速构建指南(2026 年最新)

2026年VibeCoding工具实战案例精选:1)使用Cursor在30分钟内构建现代TodoList应用(Next.js+TS+Tailwind);2)通过ClaudeCode纯终端2小时开发3D飞行射击游戏(Three.js+R3F);3)利用OpenAICodex多Agent并行4小时完成SaaS全栈开发(Next.js+Supabase+Stripe)。案例均来自真实项目,覆盖从入门到生产级开发,重点展示:自然语言Prompt技巧、迭代反馈方法、工具特性对比(Cursor可视化最佳/Claude推

hy行者勇哥的博客 3186

Oracle EBS 帐套(Ledger/SOB)如何定义会计主体、如何支撑多准则 / 多报告、组织与帐套的绑定关系、以及项目落地时的设计差异。下面从实现逻辑、核心要素、组织模型、多账簿、科目设计、项

本文对比了Oracle EBS R12与SAP S/4HANA在帐套(Ledger)设计上的核心差异。Oracle采用4C架构(科目/币种/日历/准则),帐套作为独立会计主体,主辅账物理隔离;SAP则以公司代码为主体,通过平行分类账在同一凭证中实现多准则核算。关键差异体现在:Oracle强调边界隔离,适合差异大的集团;SAP注重统一视图,适合实时合并需求。实施时需注意:Oracle避免过度建账套,SAP需统筹科目与维度设计。两者分别体现了"盒子"与"滤镜"的设计哲学。

金牌架构师 419

react函数组件中使用context

2.子组件先将父组件引入,然后通过usecontext方法进行接收。1.在父组件中创建一个createcontext并将他导出。

2301_76790013的博客 244

基于STM32设计的温室大棚种植监测系统(onenet+GPRS通信)

当前所设计的温室大棚种植监测系统基于STM32单片机开发,它能够对温室大棚内的温度、湿度、光照强度、土壤湿度、二氧化碳含量等环境参数进行实时监测,并将数据传输至OneNET云平台,实现了远程监测和管理。该系统具有体积小、功耗低、可靠性高等特点,适合在温室大棚等场合使用。

7873

填坑 | React Context原理

本文深入解析了React中Context的实现原理。通过分析DOM结构和对应的Fiber结构,揭示了Context值传递的栈式工作原理:在深度优先遍历过程中,Provider将当前值推入栈并更新_currentValue,子组件通过_currentValue获取上下文值。文章详细介绍了createContext创建上下文对象的过程,以及updateContextProvider、pushContext/popContext等关键实现。同时重点探讨了Context与bailout策略的兼容性问题,通过维护de

weixin_40710412的博客 1165

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

React Context 性能问题及解决方案深度解析

本文深入解析React Context的性能问题及优化方案。核心问题在于Context的粗粒度更新机制导致不必要组件重新渲染,浪费CPU和内存资源。通过源码分析发现,React仅检测整个Context对象引用变化,无法选择性订阅属性。文章提出三种优化方案:1) 将大Context拆分为多个小Context实现精准订阅;2) 使用useMemo和useCallback减少渲染;3) 封装高阶Selector组件实现细粒度访问。这些方案可显著降低组件无效渲染,提升应用性能。

王亮的博客 1655

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

React中Context的使用

Context 提供了一种在组件之间共享值的方式,而不必显式地通过组件树的逐层传递 props。如果获取值和使用值的层级相隔很远,或者需要使用这个值的组件很多很分散,则可以使用Context来共享数据,避免使用大量重复的props来传递值。

柯南的博客 6173

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

React旧项目升级必备:create-react-context让你提前用上Context API

还在为React旧项目无法使用Context API而烦恼吗?create-react-context作为React官方Context API提案的兼容填充库(Polyfill),让你在React 16之前的项目中也能享受到上下文传递的便利。本文将带你快速掌握这个实用工具的安装使用与最佳实践,轻松解决组件间数据传递难题。 ## 📦 一分钟快速安装 create-react-context的安

gitblog_00303的博客 633

ReactJs 高级篇一 Context 使用

React中Context主要解决了在多层级组件树种如果需要将最外层数据传递到最里层需要层层通过props属性进行传递,由此比较麻烦,所以React中出现了Context,比如我们在一个组件树中,每层都有可能用到用户信息。我们用Context在最外层进行创建全局上下文环境变量,付其初始默认值。在组件数中通过Context相关API都可以获取到。 Context主要API: 1,createCo...

liuhenghui5201的专栏 884

React 源码系列 | React Context 详解

目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api。大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(re...

止水聊技术 1074

【React Context】React中Context的使用

Context 提供了一种在组件之间共享值的方式,而不必显式地通过组件树的逐层传递 props。如果获取值和使用值的层级相隔很远,或者需要使用这个值的组件很多很分散,则可以使用Context来共享数据,避免使用大量重复的props来传递值。如果只是一个组件需要使用这个值,可以在产生这个值的位置生成这个组件,然后用props层层传递到组件实际展示的位置。

hzxOnlineOk的博客 1171

React Context

在消费阶段,消费者通过 readContext 获取最新状态,并通过 fiber. 关联当前 Context在更新阶段,从 ContextProvider 节点出发查找所有消费了该 context 的节点。

qq_37086980的博客 1583

react context的三种用法

个人理解转成大白话:提供了一个局部的全局作用域,使用Context则无需再手动的逐层传递。本文主要介绍3种的使用方式:先写好使用的基础环境条件,后续的代码都是基于此环境 在根组件中,导入上面写的,并使用提供的组件进行包裹,圈定局部的全局作用域,传值后可以提供给子组件进行消费 在组件中,导入,使用其提供的组件来订阅的变更,需要一个函数作为子元素,函数的第一个形参便是组件提供的值 此时页面中应该出现json格式的value值 导入钩子函数,该函数接收的返回值,返回的结果为该的当前值,当前的 值由上

小漠007的专栏 3360

【React】Context

Context

南栀的博客 1857

react context原理

react context原理

lin_fightin的博客 1569

【React 源码】(十五)React Context 原理

Context的实现思路还是比较清晰, 总体分为 2 步.在消费状态时,节点调用获取最新状态.在更新状态时, 由节点负责查找所有节点, 并设置消费节点的父路径上所有节点的, 保证消费节点可以得到更新.

weixin_44828588的博客 853

create-react-context与React官方Context API对比:差异与优势

create-react-context是一个为React开发者提供的实用工具,作为React官方Context API提案的polyfill,它让开发者能够在旧版本React中提前体验上下文功能。本文将深入对比create-react-context与React官方Context API的核心差异,并揭示前者在实际开发中的独特优势。 ## 什么是create-react-context? c

gitblog_00363的博客 359
上一篇: leetCode 650 只有两个键的键盘
下一篇: React学习笔记(九)refs 获取DOM节点/自定义组件的实例
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值