React Context介绍和使用

目录

    • 我是前言
    • 为什么要用(Why)
    • 使用方法(How)
    • 什么情况下使用(When)

原文链接: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 = () => (
  
    
  
);

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

// src/ComponentC.js
import React from 'react';
import ThemeContext from './ThemeContext';
const C = () => (
  
    {value => (
      

Hello World

)}
);

C直接从context中取出value。

什么情况下使用(When)

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

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

附上一个例子: 例子github

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

你可能感兴趣的:(ReactNative,&,JS)