【问题标题】:Nesting stacks in react-navigation 5react-navigation 5中的嵌套堆栈
【发布时间】: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


【解决方案1】:

与您顶部的 AppNavigator 类似的代码如下所示

//Inside the functional component
return (
  <NavigationContainer>
    {isLoggedIn ? <AuthStack /> : <AppStack />}
  </NavigationContainer>
);

这里会在给定的时间渲染一个堆栈,一旦你更新了 redux 中的 isLogged 值,另一个堆栈就会被渲染。

要将其与 v4 中的代码进行比较: NavigationContainer 替换了 createAppContainer,堆栈的条件渲染替换了 switch navigator。

【讨论】:

  • 添加到这个答案。您可以在文档中的reactnavigation.org/docs/upgrading-from-4.x/#switch-navigator 阅读更多相关信息。
  • 这看起来像我正在寻找的东西,但我怎样才能添加类似 initialRouteName: "AuthLoading" 的东西?这是第一个负责在 AppStack 和 AuthStack 之间导航的组件,它从设备获取令牌并使用服务器对其进行验证,所以我想先加载它。
  • 显示的条件是什么?让我们说像加载这样的事情,您可以将其包装在单独的堆栈中,否则您将拥有一个不需要的堆栈导航器作为所有这些堆栈的包装器
  • 没有条件显示它,这是我们要寻找的第一个组件,因为它告诉我们要渲染哪个堆栈,我将编辑我的问题并添加它的源代码。
  • 您将无法在这种方法中执行此操作,因为这会根据条件切换堆栈或屏幕,所以如果您可以为其设置状态值并根据该值进行切换会更好
猜你喜欢
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2023-03-22
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多