如何在 React v16.6 的新 CONTEXT API 中获取多个静态上下文

Posted

技术标签:

【中文标题】如何在 React v16.6 的新 CONTEXT API 中获取多个静态上下文【英文标题】:How to get multiple static contexts in new CONTEXT API in React v16.6 【发布时间】:2019-05-28 00:43:12 【问题描述】:

您好,我正在尝试访问一个组件中的多个上下文,但我只使用提供者提供的一个上下文值就获得了成功。有两个提供者ListContext 和`MappingContext。如何访问这样的上下文:

class TableData extends React.Component 
 static contextType = ListContext;
 static contextType = MappingContext;

 componentDidMount() 
   const data = this.context // it will have only one context from ListContext
  

我知道我可以在 render() 中使用多个提供程序,但我想访问像上面这样的上下文。任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

一种解决方法是使用将两个上下文组合为一个的包装器,然后导出该包装器。实现包装器的方法有多种,这里有一种:

Contexts.js

import React from "react";

export const Context1 = React.createContext("1");
export const Context2 = React.createContext("2");
export const ContextCombined1And2 = React.createContext("3");

ProvideCombinedContext.js

import React from "react";
import  Context1, Context2, ContextCombined1And2  from "./Contexts";

// This is a reusable piece that could be used by any component that requires both contexts.
const ProvideCombinedContext = props => 
  return (
    <Context1.Consumer>
      context1 => (
        <Context2.Consumer>
          context2 => (
            <ContextCombined1And2.Provider value= context1, context2 >
              props.children
            </ContextCombined1And2.Provider>
          )
        </Context2.Consumer>
      )
    </Context1.Consumer>
  );
;
export default ProvideCombinedContext;

Need2Contexts.js

import React from "react";
import  ContextCombined1And2  from "./Contexts";
import ProvideCombinedContext from "./ProvideCombinedContext";

class Need2Contexts extends React.Component 
  static contextType = ContextCombined1And2;
  componentDidMount() 
    console.log("Context=" + JSON.stringify(this.context));
  
  render() 
    return "this.context=" + JSON.stringify(this.context);
  


const WrappedNeed2Contexts = props => 
  return (
    <ProvideCombinedContext>
      <Need2Contexts ...props />
    </ProvideCombinedContext>
  );
;

export default WrappedNeed2Contexts;

index.js

import React from "react";
import ReactDOM from "react-dom";
import  Context1, Context2  from "./Contexts";
import Need2Contexts from "./Need2Contexts";

function App() 
  return (
    <div className="App">
      <Context1.Provider value="value1">
        <Context2.Provider value="value2">
          <Need2Contexts />
        </Context2.Provider>
      </Context1.Provider>
    </div>
  );


const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

您可以在此处查看并使用它:

【讨论】:

感谢详细的编码。很容易理解:) 对于类组件中的动态多上下文,请参阅linkedin.com/pulse/…【参考方案2】:

这在React context documentation中有解释:

您只能使用此 API 订阅单个上下文。如果您需要阅读多个内容,请参阅Consuming Multiple Contexts。

【讨论】:

是的。但是,如果我需要 componentDidMount 中的两个上下文,解决方法是什么?

以上是关于如何在 React v16.6 的新 CONTEXT API 中获取多个静态上下文的主要内容,如果未能解决你的问题,请参考以下文章

新版react16.6中 create-react-app升级版(webpack4.0) 配置http请求跨域问题

用React.lazy和Suspense优化React代码打包

如何使用React.lazy和Suspense进行组件延迟加载

如何在 React 中创建对象的新实例?

react面试题——面试必备

如何在 react 中的新路由更改上使用 useEffect 重新渲染变量