reactjs - 在 React 中使用另一个上下文中的上下文

我目前在我的 React 应用程序中有 2 个上下文,我试图从我的第二个上下文中的顶级上下文调用一个方法。

上下文是这样嵌套的:

App.js

function App(props) {

  return (
    <SessionContextProvider>
      <APIContextProvider>
         // I have some components here
      </APIContextProvider>
    </SessionContextProviders>
  )
}

有没有办法在我的 APIContextProvider 中使用 SessionContext?

import { SessionContext } from 'contexts/session'

export const APIContext = createContext();

export default class APIContextProvider extends Component {

    static contextType = SessionContext

    randomMethod() {
        this.context.logoutUser()
    }

    render() {
        return (
            <APIContext.Provider value={{randomMethod: this.randomMethod}}>
                {this.props.children}
            </APIContext.Provider>
        )
    }
}

问题是在我的 APIContext 中运行 randomMethod 时不起作用,因为 this.context 未定义。

这是可行的还是我遗漏了什么?

最佳答案

我为您创建了一个示例,其中 ApiProvider 使用 SessionContext 中的 logoutUser 并提供 randomMethod,它调用函数 logoutUser

import React, { createContext } from "react";

const SessionContext = createContext();

const SessionProvider = props => {
  const logoutUser = () => {
    alert("Logout user, but fast!");
  };

  return (
    <SessionContext.Provider value={logoutUser}>
      {props.children}
    </SessionContext.Provider>
  );
};

export { SessionContext as default, SessionProvider };

内部上下文

import React, { createContext, useContext } from "react";
import SessionContext from "./SessionContext";

const ApiContext = createContext();

const ApiProvider = props => {
  const logoutUser = useContext(SessionContext);

  const randomMethod = () => {
    logoutUser();
  };

  return (
    <ApiContext.Provider value={{ randomMethod: randomMethod }}>
      {props.children}
    </ApiContext.Provider>
  );
};

export { ApiContext as default, ApiProvider };

App.js

export default function App() {
  return (
    <SessionProvider>
      <ApiProvider>
        <TestComponent />
      </ApiProvider>
    </SessionProvider>
  );
}

https://codesandbox.io/s/late-bush-959st

https://stackoverflow.com/questions/60937389/

相关文章:

firefox - 如何删除 Firefox 中的 X 按钮?

regex - PowerShell 从脚本中删除所有注释

jenkins - 在airflow中的特定时间运行任务

angular - 使用 ngrx 和选择器等待资源加载到守卫中

spring-boot - Spring WebFlux Reactive 和 Kotlin Cor

prometheus - 如何在普罗米修斯中获取速率的分位数

scala - 为什么zio的putStrLn没有输出

docker - 运行 docker-compose up 后数据库权限被拒绝

java - 从 JSONObject 中删除除一个之外的所有键

python - 使用 Gmail Python 发送电子邮件