【发布时间】:2020-11-07 12:45:15
【问题描述】:
我正在尝试迁移我当前的代码库(react-navigation 4)以使用 react-navigation 5。
我迁移前的代码:
AppNavigator.js
import { createAppContainer, createSwitchNavigator } from "react-navigation";
import { AuthLoading } from "../screens/auth";
import AuthStack from "./stacks/AuthStack";
import AppStack from "./stacks/AppStack";
export default createAppContainer(
createSwitchNavigator(
{
AuthLoading: AuthLoading,
Auth: AuthStack,
App: AppStack,
},
{ initialRouteName: "AuthLoading" }
)
);
AuthStack.js 的示例
import { Auth, Registration, Login, VerifyAuth } from "../../screens/auth";
const AuthStack = createStackNavigator(
{
Auth: {
screen: Auth,
},
Registration: {
screen: Registration,
},
Login: {
screen: Login,
}
},
{ initialRouteName: "Auth" }
);
export default AuthStack;
负责决定要渲染哪个堆栈的AuthLoading.js 函数如下所示:
import React, { useState, useEffect } from "react";
import { StatusBar, View } from "react-native";
import { ActivityIndicator } from "react-native-paper";
import TokensHandler from "../../api/TokensHandler";
import { useDispatch, useSelector } from "react-redux";
import { isUserExistsByToken, setIsUserExists } from "../../actions/authAction";
const AuthLoading = ({ navigation }) => {
const dispatch = useDispatch();
const isUserExists = useSelector((state) => state.auth.isUserExists);
const [allowNavigate, setAllowNavigate] = useState(false);
const fetchData = async () => {
const token = await TokensHandler.getTokenFromDevice();
if (token === null) {
dispatch(setIsUserExists(false));
setAllowNavigate(true);
} else
dispatch(isUserExistsByToken(token)).then(() => setAllowNavigate(true));
};
useEffect(() => {
fetchData();
}, []);
useEffect(() => {
if (allowNavigate || isUserExists != null)
navigation.navigate(isUserExists ? "App" : "Auth");
}, [allowNavigate, isUserExists]);
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<ActivityIndicator size="large" />
<StatusBar barStyle="default" />
</View>
);
};
export default AuthLoading;
我已阅读文档,但不幸的是,我找不到任何地方如何重构我的代码样板以使用 react-navigation 5。
我尝试过的:
AuthStack.js
import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import { Auth, Registration, Login, VerifyAuth } from "../../screens/auth";
const Stack = createStackNavigator();
const AuthStack = () => {
return (
<Stack.Navigator initialRouteName="Auth">
<Stack.Screen name="Auth" component={Auth} />
<Stack.Screen name="Registration" component={Registration} />
<Stack.Screen name="Login" component={Login} />
</Stack.Navigator>
);
};
export default AuthStack;
我什至不知道怎么写AppNavigator.js,我试过了:
import React from "react";
import { useSelector } from "react-redux";
import { AuthLoading } from "../screens/auth";
import AuthStack from "./stacks/AuthStack";
import AppStack from "./stacks/AppStack";
const isLoggedIn = useSelector((state) => state.auth.isLoggedIn);
const Stack = createStackNavigator();
<Stack.Navigator>{isLoggedIn ? <AuthStack /> : <AppStack />}</Stack.Navigator>;
希望有任何帮助,
谢谢!
【问题讨论】:
-
那么你想基于 isLoggedIn 在两个堆栈之间切换?
-
是的,类似的,我只是希望它尽可能与上一个版本相同,将一些堆栈组合在一起并在屏幕内的这些堆栈之间导航。
标签: reactjs react-native react-redux react-navigation