React Context介绍和使用

原文链接: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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React Context 结合 Reducer 可以实现状态管理和状态更新的功能。Reducer 是一个纯函数,接收当前的状态和一个 action,返回一个新的状态。通过 Context 和 Reducer 的结合使用,可以将状态和状态更新逻辑分离到不同的文件中,使得组件的代码更加简洁和清晰。 下面是一个示例代码: ```jsx // 创建一个 context 对象 const MyContext = React.createContext(); // 定义 reducer 函数 function reducer(state, action) { switch (action.type) { case "increment": return { count: state.count + 1 }; case "decrement": return { count: state.count - 1 }; default: throw new Error(); } } // 父组件 function ParentComponent() { const [state, dispatch] = useReducer(reducer, { count: 0 }); // 将 reducer 的 dispatch 函数作为属性传递给子组件 return ( <MyContext.Provider value={{ state, dispatch }}> <ChildComponent /> </MyContext.Provider> ); } // 子组件 function ChildComponent() { // 使用 useContext 钩子获取父组件提供的 context 对象 const { state, dispatch } = useContext(MyContext); return ( <div> <p>当前的计数:{state.count}</p> <button onClick={() => dispatch({ type: "increment" })}>增加</button> <button onClick={() => dispatch({ type: "decrement" })}>减少</button> </div> ); } ``` 在上面的代码中,父组件中使用 `useReducer` 钩子创建了一个状态以及一个 dispatch 函数。将状态和 dispatch 函数通过 Context 提供给子组件。在子组件中,通过 `useContext` 钩子获取父组件提供的 state 和 dispatch 对象。当用户点击子组件中的增加或减少按钮时,会调用 dispatch 函数并传入对应的 action 对象,从而触发状态更新,更新后的状态会自动传递给所有使用了该 Context 的组件,实现了状态的管理和更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值