新的React Context API很棒,但是我似乎总是想办法在React组件之外访问它。当您位于React函数组件或React类组件内部时,一切都很好,但是当您需要从上下文中读取或重置值(例如,由于在提取函数中发生的异步操作),没有简单的方法可以做到这一点。
那么,有没有办法在React组件外部访问React Context Consumer中的值?
以后编辑: 我继承了一个基于Redux的项目,并逐渐过渡到该项目。在动作创建者中,我有一个注销功能,可以清除商店的内容:
export const logoutRequest = () => dispatch => {
navigate('Welcome')
// Reset apollo data
client.resetStore()
persistor.purge()
// Reset context api data HERE
//
}
我可以轻松地在调用注销请求的组件中创建使用者,但是这种情况发生在3个不同的组件中,我不想在那里重复代码。
答案 0 :(得分:0)
不,您不能。更新上下文的唯一方法是更改发送到Context.Provider的值。
对于异步操作,通常将结果保存在根组件(或提供程序所在的组件)中,并更改发送的值。或者,您可以在上下文中制作一个函数,如下所示:https://reactjs.org/docs/context.html#updating-context-from-a-nested-component
答案 1 :(得分:0)
您最终会在组件中调用logoutRequest()
吗?如果您不想重复代码,则可以创建一个自定义钩子:
const useLogout = () => {
const resetContext = React.useContext(SomeContext);
const logoutRequest = () => dispatch => {
navigate('Welcome');
client.resetStore();
persistor.purge();
resetContext();
};
return logoutRequest;
}
然后,您可以在组件中调用const logoutRequest = useLogout()
。
您也可以为异步操作做类似的事情。
答案 2 :(得分:0)
React 上下文仅在 UI 可用时可用。这意味着在后台任务中您无法访问它。但这并不意味着您不能在组件的“外部”访问它。
我将举一个例子,说明您可以和不能在组件外使用它:
对背景状态的更深入解释:
您应该将 3 个背景状态分开