react context API配合高阶组件的实际应用

React面试题及详细答案150道(41-50) 41. 什么是React的高阶组件(HOC)?如何实现一个HOC? 42. React中的ref有哪些使用场景?如何创建和使用ref? 43. 如何在React中实现拖拽功能? 44. 什么是React的Suspense?如何使用它处理异步加载? 45. 如何在React中实现路由守卫(权限控制)? 46. 什么是React的StrictMode?启用它会有什么效果? 47. 如何在React中实现懒加载(Lazy Loading)? 48. 什么是React的Context API?如何避免Context 阅读详情
文章概览

本文包含新版本react contextAPI的简单介绍、基本用法和实际项目中的使用方法。
本文不会介绍context和高阶组件的概念,而是介绍二者如何配合使用。

简介

react在16.3版本引入了全新的context api,提供一种跨组件传递数据的方法,避免了在多组件层级间手动传递props。

基本用法

项目中很多组件需要共有的状态比如:主题、地区偏好。如何优雅的处理呢?当然了,借助redux、mobx这些状态库可以轻松实现。但是小项目中无需引入redux等增加复杂度,让新手迷惑。
我们考虑使用context如何处理上边的问题,下边的例子为按钮添加light或dark主题:

  • 创建主题context
const THEME = {
    light: "light",
    dark: "dark",
};
const ThemeContext = React.createContext(THEME.light);
  • 使用主题
class ButtonCus extends Component{
    render() {
        return (
            <ThemeContext.Consumer>
                {theme => (
                    <button className={theme}>button</button>
                )}
            </ThemeContext.Consumer>
        );
    }
}

在这里插入图片描述
现在按钮使用context创建时默认的主题light,如果想使用dark主题需要显示提供Provider进行切换,像这样:

<ThemeContext.Provider value={THEME.dark}>
    <ButtonCus/>
</ThemeContext.Provider>

效果:
在这里插入图片描述
context的简单使用就是这样


如果每个组件都写一个Consumer,那将是多么痛苦的事。有没有简洁点的不用每次都写Consumer,能不能实现动态切换主题?
答案是肯定的
接下来将切换主题的接口放入context,实现在嵌套层级中切换主题;将Consumer封装在高阶组件中实现简洁的使用Consumer;

  • 在顶层将当前应用的主题和切换主题的方法作为context的值向下传递

这里需要将组件状态作为Provider的值传递

class App extends Component{

    constructor(props){
        super(props);
        this.switchTheme = this.switchTheme.bind(this);

        //将当前应用的主题和切换主题的方法作为context的值向下传递
        this.state = {
            theme: THEME.light,
            switchTheme: this.switchTheme
        };
    }
    switchTheme() {
        this.setState(state => {
            return {
                theme: state.theme === THEME.light
                    ? THEME.dark
                    : THEME.light
            }
        })
    }
    render(){
        return(
            <div>
                <ThemeContext.Provider value={this.state}>
                    <ButtonCus/>
                    <ButtonCus/>
                    <ButtonCus/>
                    <ButtonCus/>
                </ThemeContext.Provider>
            </div>
        )
    }
}
  • 高阶组件封装context的使用逻辑
//高阶组件将contest的使用逻辑提取出来,需要应用主题的组件只需像使用普通props一样使用主题即可
function withContext(Comp) {
    return function (props) {
        return (
            <ThemeContext.Consumer>
                {theme => <Comp {...props} theme={theme}/>}
            </ThemeContext.Consumer>
        )
    }
}
  • 修改之前的Component 组件

任意组件只要使用withContext包裹后都可以收到名为theme的属性,将其应用在合适的位置即可。

class ButtonCus extends Component{
    render() {
        return (
            <button
                className={this.props.theme.theme}
                onClick={this.props.theme.switchTheme}>button
            </button>
        );
    }
}

//使用高阶组件将普通组件应用上主题, 将高阶组件返回的组件赋值为用户命名组件,便于使用
ButtonCus = withContext(ButtonCus);

export {ButtonCus}

在这里插入图片描述
到此,点击任意按钮都可以切换全局主题。

后记

context有能力处理全局状态,配合高阶组件简化繁琐的代码,意味着小型应用完全可以使用context处理全局状态。当然redux/mobx管理大型应用状态会更加优秀。

相关链接

本文完整代码示例

新浪微博

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南 本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。 阅读详情

相关推荐

转子动力学 | 临界速度与稳定性分析

本文深入探讨了转子动力学中的核心问题——临界速度与稳定性分析。临界速度是旋转机械发生共振的危险转速,通过模态分析和坎贝尔图可进行预测。文章还剖析了油膜涡动等稳定性问题,并结合ANSYS仿真案例,详细阐述了从建模、分析到设计优化的完整工程实践流程,为旋转机械的可靠设计与安全运行提供关键指导。

weixin_29313239的博客 518

react 中 Context 的用法

【代码】react 中 Context 的用法。

qq_56491274的博客 393

手把手教你理解特斯拉Model 3的域控制器架构:RBCM如何成为“多面手”?

本文深入解析特斯拉Model 3的域控制器架构,重点介绍右车身域控制器(RBCM)如何整合车身电子系统功能。RBCM作为多任务处理中枢,管理空调系统、尾部电气设备和超声波雷达等关键功能,展现了特斯拉在汽车电子架构上的创新设计。文章详细探讨了RBCM的硬件架构、功能版图及信号网络,揭示其如何通过高性能MCU和智能开关技术实现功能集中与效率提升。

weixin_30919429的博客 384

React高阶组件结合context的应用

先来看一个案例,高阶组件增强props 如何使用context结合高阶组件来极大的简化我们的代码? 下面这个案例就是通过context传递数据到另外两个组件 import React, { PureComponent,createContext } from 'react' function enhanceUser(WrappedComponent){ return props =>{ return ( <Usercontext.Consumer>

weixin_45389051的博客 292

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

RTKLIB模糊度固定实战:三种模式对比与部分模糊度固定代码解析

本文深入解析RTKLIB中模糊度固定的三种核心模式(continuous、instantaneous、fix and hold),对比其性能与适用场景,并详细拆解了部分模糊度固定技术的源码实现。通过实战案例与代码级解析,为GNSS高精度定位开发者提供了在不同数据特性下提升固定成功率的优化思路与配置建议。

efc1234567的博客 473

React - Context & 高阶组件

1.Context(上下文) 允许跨组件传值,解决多层嵌套时,逐层向下传值的问题 创建 Context,设置默认值。在没匹配到 Provider 的情况下才会接收默认值 // myContext.js import React from 'react' const user = { name: 'Jerry', age: 25, editName: () => {} /...

sinat_33184880的博客 372

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 411

React高阶组件实例应用

1.为何使用高阶组件 实现逻辑复用,例如:用户对页面按钮操作的权限控制。 2.什么是高阶组件 React官网:具体而言,高阶组件是参数为组件,返回值为新组件的函数。 3.应用场景 鉴权判断 举个栗子: 下面代码是三块:1.页面按钮所在的组件 2.封装了鉴权逻辑的高阶组件 3.公共按钮组件 1.页面按钮所在的组件(假设是学校编辑学生档案的组件) class EditPaper extends React.Component { constructor(props) { super(p

少油少盐不要辣 1024

gesp c++ 八级知识点

gesp c++ 八级知识点

MMD.然大大 2243

解决win11无法安装.net framework 3.5(包括.net2.0和3.0)错误代码:0x80070005

解决win11无法安装.net framework 3.5(包括.net2.0和3.0)错误代码:0x80070005

zeng699304的博客 2万+

react中Context的用法,一看就懂

举个例子 ,假如有三个组件,爷爷组件,父亲组件,孙子组件,如果孙子组件要拿到爷爷组件的中的一个值, 就组要从爷爷组件传到父亲组件在传递到孙子组件才能拿到, 万一富组件中有孙子的孙子组件,那就是一级一级的传递这样就显的很麻烦 react中使用Context就解决了这个问题 安装 //安装 npm install prop-types --save //引入 import PropTypes fr...

社会人 6463

Python进阶005:修改Jupyter Notebook的工作路径

1、Jupyter Notebook简介 2、修改Jupyter Notebook的工作路径 如下三个步骤: 一、安装notebook 在CMD命令行中输入: pip install notebook 二、启动notebook jupyter notebook 启动后发现是在你的用户目录下,如下图所示,但是该目录下有很多的其他文件或文件夹,因此我想把这个环境切换到我单门创建的一个文件夹中。 三、创建notebook的配置文件 在CMD命令行中执行: jupyter notebook --genera

若北辰 1387

React childContextTypes:深入理解旧版 Context API 的类型校验机制

本文详细讲解 React 中 childContextTypes 的概念、作用与使用方法,包括其声明机制、与 contextTypes 的配合、完整代码示例以及迁移到新版 Context API 的方案,帮助开发者理解 React 跨层级数据传递的演进。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1608

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【React源码06】深入学习React 源码实现—— Context API底层实现

本文深入剖析了React Context API的实现原理,主要包含三部分内容:首先介绍了Context API从v15实验性特性到v16.3正式发布的演进历程;其次指出源码核心文件位置在ReactContext.js和ReactFiberNewContext.js;最后详细解析了Context的算法实现

silverclayz的技术分享 1015

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

React ContextType简化用法:RFC 65如何优雅使用多个Context

React ContextType是React团队在RFC 65中提出的便捷API,专门用于简化类组件中Context的使用。这个API让开发者能够更优雅地在组件中访问单个Context,同时为处理多个Context提供了清晰的解决方案。🚀 ## 什么是ContextType? ContextType是一个静态属性,允许类组件直接订阅React Context。它消除了使用`Context.

gitblog_00383的博客 1036

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

React 全新的 Context API

Context API 可以说是 React 中最有趣的一个特性了。一方面很多流行的框架(例如react-redux、mobx-react、react-router等)都在使用它;另一方面官方文档中却不推荐我们使用它。在 Context API 的文档中有下面这段话: The vast majority of applications do not need to use cont...

380

[react] 说说Context有哪些属性?

[react] 说说Context有哪些属性? context属于一种解决组件间层级过多传递数据的问题,避免了层层嵌套的通过props传递的形式,同时对于不需要使用到redux时,是一种解决方案,关于组件的复用性变差的问题,我觉得是可以通过高阶组件和context配合来解决的,因为react-redux使用的就是这样的形式; 主要的形式:createContext(value):创建一个context实例;其中的参数为当前数据的默认值,只有没在Provider中指定value时,才会生效; Context

歌谣的博客 889

React之新Context API详解

Context API 可以说是 React中最有趣的一个特性了。一方面很多流行的框架(例如 react-redux、 mobx-react、 react-router等)都在使用它;另一方面官方文档中却不推荐我们使用它。在 Context API 的文档中有下面这段话: The vast majority of applications do not need to use context....

大灰狼的小绵羊哥哥的博客 2005

Recompose 完全指南:面向函数组件与高阶组件的 React 工具腰带

本指南系统讲解 Recompose 的核心理念、常用 helper、组合方式、性能优化、Flow 类型支持与调试技巧,并结合本仓库源码(如 [withState.js](https://link.gitcode.com/i/5f1053fad676f24aa3d5370d06ba5d28)、[withReducer.js](https://link.gitcode.com/i/83ca347dcf

gitblog_00397的博客 804

React Redux 中访问 Store 的完整指南:Context 机制、自定义 Context 与多 Store 隔离方案

> 本文以 React Redux 6.x 版本官方文档《Accessing the Store》(见 [website/versioned_docs/version-6.x/using-react-redux/accessing-store.md](https://link.gitcode.com/i/ba002122718d8fa5859e6951e54a96f7))为核心骨架展开,并结合当前

gitblog_00995的博客 955

React 依赖注入(Dependency Injection)实战:从 Props 透传、HOC 注入到 Context 方案

> 本文基于 React Bits([README.md](https://link.gitcode.com/i/c0d9fb25910483324f9f34707e256c03))系列文档中的 [patterns/3.dependency-injection.md](https://link.gitcode.com/i/fd24547599f6ef5dd9db8e5e270d98e4) 展开,并

gitblog_00970的博客 920

React Context API实战:Instagram用户认证与状态管理完整实现

在现代React应用开发中,有效的状态管理是构建流畅用户体验的关键。本文将通过Instagram克隆项目的实际案例,详细介绍如何使用React Context API实现用户认证与全局状态管理,帮助你掌握这一核心技能。 ## 为什么选择Context API进行状态管理? React Context API是React官方提供的状态管理方案,特别适合管理跨组件共享的全局状态。相比Redux等复

gitblog_00607的博客 510

React Context API原理与实战:跨层级状态共享的底层机制

Context API是React中实现跨层级组件通信的基础机制,本质是基于组件树结构的上下文快照传递协议,而非全局变量。其核心原理在于Provider通过value prop触发Fiber节点的lane标记与依赖更新,useContext则在render初期同步查找最近Provider并读取值。技术价值体现在零依赖、原生支持、作用域隔离三大优势,广泛应用于主题切换、登录态管理、多语言i18n等UI衍生状态场景。本文深入源码级实现,解析createContext返回对象结构、useContext的Fiber

bk_lin的专栏 432

手写一个React-Redux,玩转React的Context API

上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库。这个库的作用是将Redux的状态机和React的UI呈现绑定在一起,当你dispatch action改变state的时候,会自动更新页面。本文还是从它的基本使用入手来自己写一个React-Redux,然后替换官方的NPM库,并保持功能一致。 本文全部代码已经上传GitHub,大家可以拿下来玩玩:https:

dennis_jiang的博客 294

web前端高级React - React从入门到进阶之组件的懒加载及上下文Context

第二部分:React进阶 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到进阶之JSX虚拟DOM渲染为真实DOM的原理和步骤 第五章:React从入门到进阶之组件化开发及Props属性传值 第六章:React从入门到进阶之state及组件的生命周期 第七章:React从入门到进阶之React事件处理 第八章:React从入门到进阶之React条件渲染 第九章:React从入门到进阶之

lixiaosenlin的专栏 5701
上一篇: codeMirror支持sql输入提示
下一篇: 现代web应用开发前后端协同工作的要点
五月西瓜
博客等级 码龄12年 4粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值