React Context介绍和使用

React Context API为深层嵌套组件提供了一种无需逐级传递Props的解决方案,适用于复杂应用和状态管理。本文详细介绍了React Context的工作原理、使用场景及如何在实际项目中实施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://www.robinwieruch.de/react-context

我是前言

React Context是个很强悍的功能。如果你的应用在逐步增大,试试它准没错。许多著名的第三方库也在使用它,例如Redux。

当你的应用控件层级很多,有时候需要把Props逐级传递,尤其是把一个Props从顶层传递到最底层,而中间的控件又不需要用这个Props的时候,React Context就显现出它的威力了。

本文将介绍React Context的使用方法,并附带例子。

为什么要用(Why)

在你的工程中,你肯定有过把一个Props从父控件逐级传递给一个很深的子控件的经历。

如下:

          +----------------+
          |                |
          |        A       |
          |        |Props  |
          |        v       |
          |                |
          +--------+-------+
                   |
         +---------+-----------+
         |                     |
         |                     |
+--------+-------+    +--------+-------+
|                |    |                |
|                |    |        +       |
|       B        |    |        |Props  |
|                |    |        v       |
|                |    |                |
+----------------+    +--------+-------+
                               |
                      +--------+-------+
                      |                |
                      |        +       |
                      |        |Props  |
                      |        v       |
                      |                |
                      +--------+-------+
                               |
                      +--------+-------+
                      |                |
                      |        +       |
                      |        |Props  |
                      |        C       |
                      |                |
                      +----------------+

这种情况下,中间每个控件都得去帮忙传递Props,尽管他们用不到这个Props。

React Context可以来帮你摆平这种混乱场景。不需要逐级传递,只需要在用这个Props的自定义控件中手到擒来,按需消费。你可以理解成:有一个全局控件在context中存储着这些Props。

          +----------------+
          |                |
          |       A        |
          |                |
          |     Provide    |
          |     Context    |
          +--------+-------+
                   |
         +---------+-----------+
         |                     |
         |                     |
+--------+-------+    +--------+-------+
|                |    |                |
|                |    |                |
|       B        |    |        D       |
|                |    |                |
|                |    |                |
+----------------+    +--------+-------+
                               |
                      +--------+-------+
                      |                |
                      |                |
                      |        E       |
                      |                |
                      |                |
                      +--------+-------+
                               |
                      +--------+-------+
                      |                |
                      |        C       |
                      |                |
                      |     Consume    |
                      |     Context    |
                      +----------------+

这种情况应用在什么场景呢?

举个简单的例子: 假如有一个主题颜色,一个界面的很多子控件都需要用到它。这个时候如果从父控件向每一个子控件逐级传递,那就很麻烦。这个时候React Context就可以上场了。

React Context需要谁来提供的,又是谁来使用?

顶层控件提供,例如结构图中的A。

需要使用这个Props的控件使用,例如结构图中的C。

使用方法(How)

首先,你得创建一个React Context控件,以供提供者和使用者调用。

在你使用React的createContext函数创建了context的时候,你可以赋给它一个初始值,这个初始值可以使null。

// src/ThemeContext.js
import React from 'react';
const ThemeContext = React.createContext(null);
export default ThemeContext;

其次,控件A利用上面创建的控件提供一个context。这个时候可以提供初始值,这个初始值可以是任何值。如果这个值是个可读写的状态值,那么可以在接收使用这个值的控件中更改。

// src/ComponentA.js
import React from 'react';
import ThemeContext from './ThemeContext';
const A = () => (
  <ThemeContext.Provider value="green">
    <D />
  </ThemeContext.Provider>
);

这里提供了一个要传递的值:value=“green”。 这个值将要在C中使用。

// src/ComponentC.js
import React from 'react';
import ThemeContext from './ThemeContext';
const C = () => (
  <ThemeContext.Consumer>
    {value => (
      <p style={{ color: value }}>
        Hello World
      </p>
    )}
  </ThemeContext.Consumer>
);

C直接从context中取出value。

什么情况下使用(When)

什么情况下使用?简单概括以下两种情况:

  • 界面上有很多层级控件的时候,如果你想从最顶层向底层控件传递一个Props,而中间的控件又不需要使用这个Props的时候。(其实上面已经说过了,外国人好啰嗦_
  • 当一个全局状态需要管理的时候(想象一下状态机),React Context可以用于全局状态管理。

附上一个例子: 例子github

翻译能力一般,请多包含^ _ ^。再次感谢原作者!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值