【发布时间】:2020-09-25 16:04:10
【问题描述】:
我目前正在使用 react-native 项目 v0.63.2 并使用 @react-navigation-5。初始屏幕、登录屏幕和选项卡屏幕的导航基于上下文。
appContext.js
import React from 'react';
const AppContext = React.createContext({IsLoading: true, IsLoggedIn: false});
export default AppContext;
navigationContainer.js
import AppContext from './appContext';
const StackApp = createStackNavigator();
export const StackNavigator = () => {
const [appState, setAppState] = React.useState({});
const state = { appState, setAppState };
React.useEffect(() => {
setAppState({ IsLoading: true, IsLoggedIn: false });
}, []);
return (
<AppContext.Provider value={state}>
{appState.IsLoading ? (
<SplashScreen />
)
: (
<NavigationContainer>
<StackApp.Navigator>
{
appState.IsLoggedIn
?
<>
<StackApp.Screen name='BottomTabScreen' component={BottomTabScreen} options={{ headerShown: false }} />
</>
:
<StackApp.Screen name='LoginScreen' component={NavigatorLogin} options={{ headerShown: false }} />
}
</StackApp.Navigator>
</NavigationContainer>
)}
</AppContext.Provider>
)
}
我用一个类组件重新创建了新的登录页面。它可以作为功能组件加载所有以前的方式。但我无法修改/更新IsLoggedIn: true 的上下文。
我尝试过的:- initLogin.js
import AppContext from '../navigator/appContext';
const AppState = ({ newContext }) => {
const { setAppState } = React.useContext(AppContext);
console.log('setAppState:=> ' + JSON.stringify(setAppState));
console.log('newContext:=> ' + JSON.stringify(newContext));
setAppState(newContext);
}
export class initSignIn extends Component {
onPressLogin = () => {
AppState({ IsLoggedIn: true });
}
}
这将引发错误挂钩规则
无效的挂钩调用。 Hooks 只能在函数组件内部调用
我也尝试过使用静态上下文。没有错误,但未定义的值表明键 IsLoggedIn 不存在。
我的一些参考:
我添加了零食最小脚本。由于我使用的 UI Kitten 主题,可能会出现错误。我对零食不熟悉 Minimal Script
【问题讨论】:
-
有没有零食可以让我们检查一下?
-
以前不要吃零食。不过明天我会用snack添加一些极简的脚本。
-
抛开导航,你只是想从一个类组件中更新上下文,对吧?也许我今天晚些时候会创建一个:)
-
正确。我只想更新上下文,以便
navigationContainer.js可以从登录导航到底部选项卡,并在注销时返回登录 -
请检查我的答案:)
标签: javascript reactjs react-native