React高级指南(九)【Context】

【速通版!语义通信基础与前沿学习计划】 🧠语义通信基础与前沿学习计划 阅读详情

在React中,在React组件中很容易追踪数据流。当你观察组件时,你可以找出哪些属性(props)被传递,这使得你的应用非常容易理解。

在某些场景下,你想在整个组件树中传递数据,但却不想手动地在每一层传递属性。你可以直接在React中使用强大的context API解决上述问题。

为什么不要使用Context

绝大多数的应用程序不需要使用context。

如果你希望使用应用程序更加稳定就不要使用context。这只是一个实验性的API并且可能在未来的React版本中移除。

如果你不熟悉React或者Mobx这类state管理库,就不要使用context。对于许多应用程序,上述库和state绑定是管理state不错的选择。Redux相比context是更好的解决方法。

如果你不是一个有经验的React开发者,就不要使用context。更好的方式是使用props和state。

如果你不顾这些警告仍然坚持使用context,尝试着将context的使用隔离在一个将小的范围内,并且在可能的情况下直接使用context,以便在API改变的时候进行升级。

如何使用Context

假定有下面的结构:

class Button extends React.Component {
  render() {
    return (
      <button style={{'{{'}}background: this.props.color}}>
        {this.props.children}
      </button>
    );
  }
}

class Message extends React.Component {
  render() {
    return (
      <div>
        {this.props.text} <Button color={this.props.color}>Delete</Button>
      </div>
    );
  }
}

class MessageList extends React.Component {
  render() {
    const color = "purple";
    const children = this.props.messages.map((message) =>
      <Message text={message.text} color={color} />
    );
    return <div>{children}</div>;
  }
}

在这个例子中,我们手动地传递color属性使得Button和Message设置正确的样式。使用context,我们可以自动在组件树中传递属性。

class Button extends React.Component {
  render() {
    return (
      <button style={{'{{'}}background: this.context.color}}>
        {this.props.children}
      </button>
    );
  }
}

Button.contextTypes = {
  color: React.PropTypes.string
};

class Message extends React.Component {
  render() {
    return (
      <div>
        {this.props.text} <Button>Delete</Button>
      </div>
    );
  }
}

class MessageList extends React.Component {
  getChildContext() {
    return {color: "purple"};
  }

  render() {
    const children = this.props.messages.map((message) =>
      <Message text={message.text} />
    );
    return <div>{children}</div>;
  }
}

MessageList.childContextTypes = {
  color: React.PropTypes.string
};

通过给MessageList添加childContextTypes和childContextTypes(context提供者),React自动地向下传递信息,任何子树(例如:Button)可以通过定义contextTypes访问到属性。

如果没有定义contextTypes,context将是一个空的object。

父子耦合

Context可以构建API使得父组价和子组件进行相互通信。例如:React Router V4工作机制如下:

import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/topics">Topics</Link></li>
      </ul>

      <hr />

      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/topics" component={Topics} />
    </div>
  </Router>
);

通过从Router中传递相关信息,Router中的每一个Link和Route都可以与之通信。

在你构建包含类似于上述的API的组件之前,考虑是否有其他的更清晰的选择。例如,你可以传递整个React组件作为props传递。

在生命周期函数中使用Context

如果contextTypes在组件中定义,下列的生命周期函数将接受一个额外的参数:context对象

在无状态的函数式组件中使用Context

如果contextType被定义为函数的属性,无状态函数式组件也能够引用context。下面的代码演示了一个Button状态的函数式组件。

const Button = ({children}, context) =>
  <button style={{'{{'}}background: context.color}}>
    {children}
  </button>;

Button.contextTypes = {color: React.PropTypes.string};

更新Context

别这么做!

React有一个API更新context,但是它打破了基本流程,不应该使用。

getChildContext函数将会在每次state或者props改变时调用。为了更新context中的数据,使用this.setState触发本地状态的更新。这将触发一个的context并且数据的改变可以被子元素收到。

class MediaQuery extends React.Component {
  constructor(props) {
    super(props);
    this.state = {type:'desktop'};
  }

  getChildContext() {
    return {type: this.state.type};
  }

  componentDidMount() {
    const checkMediaQuery = () => {
      const type = window.matchMedia("(min-width: 1025px)").matches ? 'desktop' : 'mobile';
      if (type !== this.state.type) {
        this.setState({type});
      }
    };

    window.addEventListener('resize', checkMediaQuery);
    checkMediaQuery();
  }

  render() {
    return this.props.children;
  }
}

MediaQuery.childContextTypes = {
  type: React.PropTypes.string
};

问题在于,组件提供的context值改变,后代元素如果shouldComponentUpdate返回false那么context的将不会更新。这使得使用context的组件完全失控,所以基本上没有办法可靠的更新context。这篇blog很好的解释了为什么这是一个问题并如果绕过它。

差分运放电路输出电压偏置设计解析 差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。 阅读详情

相关推荐

别再为通讯发愁了!手把手教你用PCAN-View调试Kinco步科伺服电机的CANopen

本文详细介绍了如何使用PCAN-View工具调试Kinco步科伺服电机的CANopen通讯,从环境搭建到实战演练,涵盖硬件连接、软件配置及故障排除。通过具体案例和代码示例,帮助工程师快速掌握伺服电机通讯控制技术,解决工业设备通讯难题。

weixin_29189377的博客 266

React的生命周期

React 组件的生命周期 React中组件有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化、运行中、销毁、错误处理(16.3之后) ( 共12个钩子函数 ) 注意: 生命周期钩子函数一定不要写成箭头函数 初始化 在组件初始化阶段会执行 5个钩子函数【 1个将来会使用 】 1. constructor( props ) construc...

csdnzlcheng的博客 4910

【ShaderToy】开篇

写在前面呜呼,好久没有写博客了,好惭愧。题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎。开学还是爬上来老实更新博客学习吧~今天爬上来一看,发现优快云的博客编辑终于更新了!进步总是好的,以前的编辑器实在很捉急。使用这种标记语言的确方便了很多,但好像颜色字体没法设置?程序员果然对美观没什么追求。ShaderToy如果你还没听过Sha

candycat 8万+

react里的context

文章目录一、什么是上下文(context)?二、旧版本的上下文上下文的创建上下文的使用二、新版本的上下文总结 一、什么是上下文(context)? 上下文,当一个组件创建了上下文后,其后代组件都可以使用该上下文中的数据。 在之前的学习中,我们知道react的数据要么来源于自身的状态,要么来源于父级传过来的props。 有了上下文之后,组件多了一个数据来源,那就是context上下文。 react16版本前的的上下文和16版本之后的上下文是不一样的。 二、旧版本的上下文 旧版本的react认为只有类才有状态

Mr_RedStar的博客 1393

Yolov26 在 Rk3588 上的 Rknn Onnx 部署实践(模型转换)

本文详细介绍了将YOLOv26 ONNX模型转换为RKNN模型的过程,适用于RK3588平台。主要内容包括:1)量化数据集的创建,通过随机抽取最多400张JPG图片生成校准数据集;2)ONNX转RKNN的完整脚本,支持多种量化方式和平台适配;3)模型转换的参考调用方式;4)模型结构对比展示。文章还提供了注意事项,强调量化数据集图片尺寸、mean/std值需与实际推理一致,并给出精度优化建议。该转换流程为YOLOv26模型在RK3588上的高效部署提供了完整解决方案。

qq_64366203的博客 1125

Python 打包与发布陷阱:如何用 setuptools 和 PyInstaller 生成跨平台可执行文件?

使用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1206

详解 React 中的 Context

context 是 React 提供的一个跨层级通信的方式,它允许父组件向其下面整个树提供数据,让我们可以不用显式地通过组件树逐层传递 props。

nana_lala的博客 5332

Python 爬虫实战:淘宝直播间实时数据抓取(弹幕分析 + 流量监控)

随着电商直播的迅猛发展,淘宝直播已成为品牌推广和商品销售的重要阵地。通过爬取淘宝直播间的实时数据,包括弹幕互动和流量信息,可以帮助商家深入了解用户行为、优化直播策略,同时为市场分析和商业决策提供数据支持。本文将深入探讨如何利用 Python 爬虫技术实现对淘宝直播间实时数据的抓取,并进行弹幕分析和流量监控。

u014481728的博客 729

React Context用法整理(附完整代码)

文章目录前言知识点汇总场景1:使用`Provider`和`Consumer`生产和消费数据文件目录及说明代码文件效果场景2:使用`ContextType`接收数据文件目录及说明代码文件效果场景3:动态和静态Context代码文件效果场景4:在嵌套组件中更新Context代码文件效果场景5:消费多个Context代码文件效果 前言 g yue h传统的React应用中,数据通过props属性自上而下(由父组件向子组件)传递,当组件层级数量增多时,在每一层传递props则很繁琐,Context提供了一种新的组件

虚怀若愚 1万+

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 717

SAP 经营范围(Operating Concern) 和业务范围 (Business Area) 在核算架构或是管理架构中的区别和联系分别是什么 请给具体的示例

摘要:SAP系统中,业务范围(Business Area)和经营范围(Operating Concern)在核算架构中具有不同功能。业务范围是FI/CO共用维度,用于跨公司码的业务线核算(如电子产品、机械设备),支持内部管理和简单对外报表。经营范围则是CO-PA专属维度,聚焦获利能力分析,可细化到产品+客户+区域组合(如分析手机在华东区域的获利情况)。两者存在层级关联:经营范围包含业务范围作为基础维度,业务范围数据会传递至经营范围进行深度分析。实际应用中需先配置业务范围,再设置经营范围并关联相关维度,共同支

金牌架构师 94

什么是React中的Context(上下文)?它的作用是什么?

基本概念与作用代码示例与实践示例一:创建一个 Context示例二:使用 Consumer 消费 Context示例三:使用 useContext Hook示例四:嵌套 Contexts示例五:Context 类型定义与默认值不同角度的功能使用思路1. **状态管理**2. **条件渲染**开发中的使用技巧自行拓展内容在现代的前端开发中,随着应用程序变得越来越复杂,组件间的通信成为了一个重要的议题。React 提供了多种方式来解决这一问题,其中是一种非常高效且灵活的选择。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1317

YOLOv11改进缝合注意力 | 深度优化的BiFormer模型-结合BiLevel Routing Attention与深度可分离卷积的创新应用(附代码)

YOLO(You Only Look Once)系列目标检测算法一直以来都是计算机视觉领域的热门选择。随着YOLOv11的发布,它在许多实际应用场景中取得了显著的性能提升。然而,面对日益复杂的目标检测任务,单纯依赖卷积神经网络(CNN)在某些情况下已经显得力不从心,特别是在处理小尺度、密集目标以及遮挡目标时,卷积操作的局部性限制了模型的表达能力。

一键难忘的博客 715

practical-aspnetcore 实战:gRPC-Web 服务器流式传输(Server Streaming)——让浏览器在 HTTP/1.1 下持续接收服务端消息

本指南基于 practical-aspnetcore 仓库中的 [projects/grpc/grpc-11](https://link.gitcode.com/i/958ec541099d796e36389c882384d956) 示例,完整讲解如何用 ASP.NET Core 搭建一个 gRPC-Web 服务器流(Server Streaming)服务:服务端每 5 秒推送一条消息、共推送 1

gitblog_01195的博客 966

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ReactJs 高级篇一 Context 使用

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

liuhenghui5201的专栏 884

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

React 高级指引之 Context

React 高级指引之 Context   1.为什么使用 Context   首先来考虑这样一个场景,有一段文本内容用于展示主题的字体颜色及字体大小。我们可以通过组件的属性来传递,代码如下:   顶层组件,定义主题 // 引入中间组件 import IntermediaryComponents from './IntermediaryComp' // 顶层组件,定义主题 class Context extends React.Component { constructo

_ 3989

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

React中使用Context:从基础到高级实践的全面指南

React的Context API解决了组件跨层级通信的痛点,通过创建、提供和消费三个步骤实现数据共享。基础用法包括useContext钩子、Context.Consumer组件和类组件的contextType。进阶用法支持复杂状态管理,如将状态和更新方法打包传递。对于多维度数据,建议使用多个独立Context避免性能问题。Context特别适合主题切换、用户信息等全局数据场景,能有效减少props逐层传递的冗余代码,提升应用可维护性。

m0_46335150的博客 1128

填坑 | React Context原理

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

weixin_40710412的博客 1163

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

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

王亮的博客 1655

React中Context的使用

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

柯南的博客 6172

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

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

gitblog_00303的博客 632

React高级特性之Context

Context提供了一种不需要手动地通过props来层层传递的方式来传递数据。

grooyo的博客 543

React 源码系列 | React Context 详解

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

止水聊技术 1073

【React Context】React中Context的使用

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

hzxOnlineOk的博客 1171

React Context

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

qq_37086980的博客 1582

react context的三种用法

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

小漠007的专栏 3358
上一篇: MVC5中使用Log4net
下一篇: React高级指南(十)【Web Components】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值