joh*_*n23 3 reactjs react-hooks
目前,我的 React 应用程序中有 2 个上下文,我试图在第二个上下文中从顶级上下文调用一个方法。
以下是上下文的嵌套方式:
应用程序.js
function App(props) {
return (
<SessionContextProvider>
<APIContextProvider>
// I have some components here
</APIContextProvider>
</SessionContextProviders>
)
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在我的 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>
)
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,在我的 APIContext 中运行 randomMethod 时不起作用,因为 this.context 未定义。
这是可行的还是我错过了什么?
我为您创建了一个示例,其中ApiProvider使用logoutUserfromSessionContext和providing 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 };
Run Code Online (Sandbox Code Playgroud)
内部背景
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 };
Run Code Online (Sandbox Code Playgroud)
应用程序.js
export default function App() {
return (
<SessionProvider>
<ApiProvider>
<TestComponent />
</ApiProvider>
</SessionProvider>
);
}
Run Code Online (Sandbox Code Playgroud)
https://codesandbox.io/s/late-bush-959st
| 归档时间: |
|
| 查看次数: |
9686 次 |
| 最近记录: |