在 React 应用中,我们经常需要在组件之间共享状态和数据。而 React 的 createContext 和 Provider 就是为了解决这个问题而诞生的。

createContext:创建自定义上下文

首先,让我们来看看 createContext。这个函数接受一个初始值作为参数,并返回一个新的 Context 对象,我们可以将其称为自定义上下文。这个上下文将作为数据的传递媒介,让我们不再需要通过一层层的 props 来传递数据。

让我们先来看一个简单的例子:

// 创建一个自定义上下文
const MyContext = React.createContext('defaultValue');

在这个例子中,我们创建了一个名为 MyContext 的自定义上下文,并给定了一个默认值 'defaultValue'。

Provider:提供数据给后代组件

接下来,我们需要一个 Provider 组件来将数据传递给后代组件。这个组件接受一个 value 属性,用于传递上下文的值给后代组件。当 Provider 的 value 发生变化时,所有依赖于这个上下文的后代组件都会重新渲染。

function App() {
const [theme, setTheme] = useState('dark'); return (
// 使用 Provider 提供上下文的值
<MyContext.Provider value={theme}>
{/* 后代组件 */}
<Toolbar />
</MyContext.Provider>
);
}

在这个例子中,App 组件作为 MyContext.Provider,提供了 theme 的值给所有的后代组件。这使得后代组件可以方便地获取这个 theme 的值。

useContext:在子组件中获取上下文的值

最后,让我们来看看如何在子组件中获取上下文的值。我们可以使用 useContext 这个钩子来获取 MyContext 的值,并在子组件中使用它。

function Toolbar() {
const theme = useContext(MyContext); return (
<div style={{ background: theme === 'light' ? '#fff' : '#000' }}>
{/* 渲染其他内容 */}
</div>
);
}

在这个例子中,Toolbar 组件使用了 useContext 钩子来获取 MyContext 的值,并根据这个值来决定渲染的背景颜色。

总结

通过 createContext 和 Provider,我们可以轻松地在 React 应用中共享状态和数据,而不再需要手动通过一层层的 props 来传递数据。这种方式使得组件的设计更加清晰,代码更加简洁,提高了应用的可维护性和可扩展性。

🌟 简单理解 React 的 createContext 和 Provider 🚀的更多相关文章

  1. 简单整理React的Context API

    之前做项目时经常会遇到某个组件需要传递方法或者数据到其内部的某个子组件,中间跨越了甚至三四层组件,必须层层传递,一不小心哪层组件忘记传递下去了就不行.然而我们的项目其实并没有那么复杂,所以也没有使用r ...

  2. 理解 React,但不理解 Redux,该如何通俗易懂的理解 Redux?

    作者:Wang Namelos链接:https://www.zhihu.com/question/41312576/answer/90782136来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  3. 理解 React,但不理解 Redux,该如何通俗易懂的理解 Redux?(转)

    作者:Wang Namelos 链接:https://www.zhihu.com/question/41312576/answer/90782136来源:知乎 解答这个问题并不困难:唯一的要求是你熟悉 ...

  4. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  5. 深入理解React(二) —— 数据流和事件原理

    版权声明:本文由左明原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/158 来源:腾云阁 https://www.qclou ...

  6. 深入理解React、Redux

    深入理解React.ReduReact+Redux非常精炼,良好运用将发挥出极强劲的生产力.但最大的挑战来自于函数式编程(FP)范式.在工程化过程中,架构(顶层)设计将是一个巨大的挑战.要不然做出来的 ...

  7. 理解 React Hooks 心智模型:必须按顺序、不能在条件语句中调用的规则

    前言 自从 React 推出 hooks 的 API 后,相信大家对新 API 都很喜欢,但是它对你如何使用它会有一些奇怪的限制.比如,React 官网介绍了 Hooks 的这样一个限制: 不要在循环 ...

  8. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  9. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  10. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

随机推荐

  1. K8s Ingress Provider 为什么选择 MSE 云原生网关?

    ​简介:在虚拟化时期的微服务架构下,业务通常采用流量网关 + 微服务网关的两层架构,流量网关负责南北向流量调度和安全防护,微服务网关负责东西向流量调度和服务治理,而在容器和 K8s 主导的云原生时代, ...

  2. 涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理

    简介: 本文尝试解读ClickHouse存储层的设计与实现,剖析它的性能奥妙 作者:和君 引言 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内各个大厂 ...

  3. 【CDS技术揭秘系列 总篇】阿里云的云定义存储来了

    ​简介: 全新发布的云定义存储 CDS 和传统的存储阵列.分布式存储.软件定义存储的区别在哪里?阿里云存储团队如何看待将来存储的发展趋势?本文邀请了 CDS 研发团队的核心技术负责人为大家揭开围绕着阿 ...

  4. Alibaba FFI -- 跨语言编程的探索

    ​简介: 跨语言编程时现代程序语言中非常重要的一个方向,也被广泛应用于复杂的设计与实现中. 跨语言编程是现代程序语言中非常重要的一个方向,也被广泛应用于复杂系统的设计与实现中.本文是 GIAC 202 ...

  5. [FAQ] VScode 用户代码片段设置

      以PHP为示例,配置如下: { "dpe": { "prefix": "dpe", "body": [ " ...

  6. [FE] FastAdmin 动态下拉组件 Selectpage 自定义 data-params

    正常情况下,我们想获取列表只需要定义接口路径和要显示的字段名即可, 比如: <input id="c-package_ids" data-rule="require ...

  7. dotnet 读 WPF 源代码笔记 聊聊 HwndWrapper.GetGCMemMessage 调试消息

    我在阅读 WPF 源代码,在 HwndWrapper 的静态构造函数看到了申请了 HwndWrapper.GetGCMemMessage 这个 Windows 消息,好奇这个消息是什么功能的.通过阅读 ...

  8. 2018-8-10-win10-uwp-App-to-app-communication-应用通信

    title author date CreateTime categories win10 uwp App-to-app communication 应用通信 lindexi 2018-08-10 1 ...

  9. 使用 Kafka Assistant,为您的开发加速

    简要介绍 快速查看所有 Kafka 集群,包括Brokers.Topics和Consumers 支持各种认证模式:PLAINTEXT.SASL_PLAINTEXT.SSL.SASL_SSL 对Kafk ...

  10. Mybatis学习四(分页助手pagehelper)

    Mybatis学习过程中有一个很重要的插件分页助手(pagehelper) 能够运用这个插件也非常简单 1.导入jar包 [jsqlparser-2.0.jar包] [点击下载https://gith ...