好的,我发现在我的情况下似乎是最好的解决方案:
https ://dev.to/efearas/how-to-usecontext-and-set-value-of-context-in-child-components-in-3-steps -3j9h
我创建上下文文件auth-context.js
:
import React from 'react';
export const AuthContext = React.createContext();
我在其中创建令牌挂钩App.js
并将其包装起来,如下所示:
import { AuthContext } from "./auth-context.js";
function AppNavigator() {
const [token, setToken] = useState(null);
return (
<AuthContext.Provider value={[token, setToken]}>
<NavigationContainer>
<Stack.Navigator initialRouteName="Auth">
<Stack.Screen
name="BottomTabs"
component={BottomTabs} // this separate navigator has my map and list components and they also get token in this way
/>
<Stack.Screen
name="Auth"
component={Auth}
/>
<Stack.Screen
// other components which I don't want to have in BottomTabs
/>
</Stack.Navigator>
</NavigationContainer>
</AuthContext.Provider>
在我的auth.js
组件中,我setToken
:
import { AuthContext } from "../auth-context.js";
export default function Auth(props) {
const [token, setToken] = useContext(AuthContext);
useEffect(() => {
(async () => {
const token = await AsyncStorage.getItem('token')
if (token)
setToken(token);
props.navigation.replace("BottomTabs", {screen: "Map"});
})()
}, []);
例如,在这里,它尝试从 AsyncStorage 获取令牌,如果确实如此,则将其设置为 Context Hook(如果我可以这样调用),然后导航到 Map 屏幕(位于子 Tab.Navigator 上)。无论如何,这只是我使用 React Navigation 5 的项目复杂性。:)
设置令牌后,您可以以相同的方式在其他组件中访问它:
import { AuthContext } from "../auth-context.js";
....
const [token, setToken] = useContext(AuthContext);
免责声明:我远非专家,所以我的解决方案可能不是最漂亮的,但它对我有用,我希望我的挣扎的答案也能帮助其他人:)。
如果有人看到可以做得更好的地方,请添加您的答案。谢谢大家!