【问题标题】:Implement StackRouter in react navigation v5 for nested routes在 React Navigation v5 中为嵌套路由实现 StackRouter
【发布时间】:2021-04-19 17:59:28
【问题描述】:

我有一个带有以下屏幕层次结构的 react native 应用程序

RootNavigator
  |
  |---AppNavigatorStack
  |     |--Screen1
  |     |--Screen2
  |
  |---LoginNavigatorStack
        |--loginScreen
        |--forgotPasswordScreen

我一直在尝试为此工作流程创建StackRouter

const options = {
  initialRouteName: 'LoginNavigatorStack',
}

const routerConfigOptions = {
  routeGetIdList: {},
  routeNames: ["AppNavigatorStack", "LoginNavigatorStack"],
  type: 'stack',
  routeParamList: {}
}

let router = StackRouter(options)

如何在 StackRouter 中配置 routerConfigOptions 以使用 getStateForActiongetInitialState 等功能

创建新状态的示例代码

const action = CommonActions.reset({
    index: 0,
    routes: [{name: "Screen2"}],
})

let newState = router.getStateForAction(state, action, routerConfigOptions)

state - 我们可以从 NavigationContainer 的 onStateChange 中获取应用程序的当前状态对象

newState的结果是null,因为我还没有在routerConfigOptions中添加Screen1、Screen2、loginScreen、forgotPasswordScreen

我实际上期待一个新的状态,它应该具有导航到 loginScreen 的详细信息。

如何添加所有嵌套屏幕并为此创建 StackRouter?

【问题讨论】:

  • 你想做什么?您极不可能需要手动使用路由器
  • 我一直在使用mobx-state-tree 进行导航。实际上,我们的应用是在 react-navigation v1 上开发的。我已将其更新为 v5。因此,在 v1 中,StackNavigator 中有一个名为 router 的静态属性,现在不可用。所以这是目前的方式。但我还没有看到任何关于此的适当文档。这个问题也和我有关:stackoverflow.com/questions/60326679/…
  • 要在此级别自定义导航,您需要使用自定义导航,这可能会增加代码的复杂性,您是否考虑过使用动态路由在导航器之间切换?这可能会节省大量编码。
  • 由于您正在升级到 v5,因此您也应该借此机会停止使用 mobx 进行导航。使用 React Navigation API 比尝试破解它以与其他状态管理集成要花费更少的精力。你真的不需要这种集成。我们也不推荐或正式支持这样做。
  • 所有这些事情都可以在不这样做的情况下以更简单的方式完成。复制状态是一种不好的做法,不仅在 React Navigation 中。我维护 React Navigation,所以我想我可以说出哪些做法是 hack。

标签: react-native react-navigation


【解决方案1】:

你的语法看起来更像 react-navigation

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const LoginStack = createStackNavigator();
const AppStack = createStackNavigator();
const RootStack = createStackNavigator();

const LoginStackNavigator = () => {
    return (
        <LoginStack.Navigator>
            <LoginStack.Screen name="LoginScreen" component={LoginScreen}/>
            <LoginStack.Screen name="ForgotPasswordScreen" component={ForgotPasswordScreen}/>
        </LoginStack.Navigator>
    )
}

const AppStackNavigator = () => {
    return (
        <AppStack.Navigator>
            <AppStack.Screen name="Screen1" component={Screen1}/>
            <AppStack.Screen name="Screen2" component={Screen2}/>
        </AppStack.Navigator>
    )
}

const RootStackNavigator = () => {
    return (
        <RootStack.Navigator>
            <RootStack.Screen name="LoginStackNavigator" component={LoginStackNavigator}/>
            <RootStack.Screen name="AppStackNavigator" component={AppStackNavigator} />
        </RootStack.Navigator>
    )
}



const App: () => React$Node = () => {
    return (
        <NavigationContainer>
            <RootStackNavigator/>
        </NavigationContainer>
    );
};

【讨论】:

猜你喜欢
  • 2020-05-23
  • 2021-03-02
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多