如何在反应导航中的不同嵌套堆栈之间导航

izi*_*drw 27 react-native react-navigation

目标

使用反应导航,从导航器中的屏幕导航到不同导航器中的屏幕.

更多详情

如果我有以下导航器结构:

  • 父导航器
    • 嵌套导航器1
      • 屏幕A.
      • 屏幕B.
    • 嵌套导航器2
      • 屏幕C.
      • 屏幕D.

如何从嵌套导航器2下的屏幕D转到嵌套导航器1下的屏幕A?现在,如果我尝试navigation.navigate从屏幕D屏幕A,将会出现一个错误,表示它不知道屏幕A,只有屏幕C和D.

我知道这已被要求以各种形式在本网站上的各个地方以及GitHub上(https://github.com/react-navigation/react-navigation/issues/983,https://github.com/react-导航/ react-navigation/issues/335#issuecomment-280686611)但是对于那些基本的东西,缺乏明确的答案并滚动浏览数百个GitHub评论搜索解决方案并不是很好.

也许这个问题可以编写如何为每个遇到这个非常常见问题的人做这件事.

mah*_*man 64

在 React Navigation 5 中,通过将屏幕作为第二个参数传入,这变得更加容易:

navigation.navigate('Nested Navigator 2', { screen: 'screen D' });
Run Code Online (Sandbox Code Playgroud)

如果您有深层嵌套的屏幕,您还可以包含其他级别:

navigation.navigate('Nested Navigator 2', {
    screen: 'Nested Navigator 3', params: {
        screen: 'screen E'
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 答案中的“Nested Navigator 2”是什么以及如何定义它? (10认同)
  • 但如何将它与“push”功能一起使用呢? (8认同)
  • 您甚至可以使用参数在更深的导航结构中导航,例如 Root -> Settings -> Sound -> Media: `navigation.navigate('Root', { screen: 'Settings', params: { screen: 'Sound', params : { 屏幕: '媒体' }}});` (4认同)
  • 如果屏幕具有唯一的名称,为什么该过程不是自动的?为什么我们还必须包括路线? (3认同)

Sta*_*kia 35

您可以使用speficy子操作的第三个参数navigate.

例如,如果要从嵌套导航器2下的屏幕D转到嵌套导航器1下的屏幕A:

this.props.navigation.navigate('NestedNavigator1', {}, NavigationActions.navigate({ routeName: 'screenB' }))
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用的是嵌套导航器,请务必查看v2文档中的常见错误部分.

  • React Navigation v.5.0 怎么样? (13认同)
  • 什么是导航操作?看来我无法从任何地方导入它 (4认同)
  • @niksn试试这个this.props.navigation.navigate('NestedNavigator1',{},NavigationActions.navigate({routeName:'screenB',params:{param1:'value1'}}))) (3认同)
  • 什么是''NestedNavigator1'?引用? (2认同)

Abo*_*zlR 15

在 React 导航 v5/v6 中

导航到堆栈上的特定屏幕

navigation.navigate('Home', {
   screen: 'Profile',
   params: {userID: 1}
 }
)
Run Code Online (Sandbox Code Playgroud)

如果我们筑巢更多怎么办?

考虑这个结构:

NAVIGATOR:
  *StackA
    *ScreenC
    *ScreenD
  *StackB
    *ScreenI
    *StackE
      *ScreenF
      *StackG
        *ScreenJ
        *ScreenH
Run Code Online (Sandbox Code Playgroud)

我们希望从 StackA 中的 ScreenC 一直到 StackB 中的 ScreenH。我们实际上可以将参数链接在一起以访问特定的屏幕。

navigation.navigate('StackB',{
   screen: 'StackE',
   params: {
      screen: 'StackG',
      params: {
         screen: 'ScreenH'
      }
   }
  }
)
Run Code Online (Sandbox Code Playgroud)

了解更多信息


Phi*_*ews 13

React Navigation v3:

Navigation.navigate现在将一个对象作为参数。您设置堆栈名称,然后按以下步骤导航到该堆栈中的路由...

navigation.navigate(NavigationActions.navigate({
    routeName: 'YOUR_STACK',
    action: NavigationActions.navigate({ routeName: 'YOUR_STACK-subRoute' })
}))
Run Code Online (Sandbox Code Playgroud)

创建您的堆栈时,“ YOUR_STACK”就是您要调用的堆栈...

  YOUR_STACK: createStackNavigator({ subRoute: ... })
Run Code Online (Sandbox Code Playgroud)


Roc*_*uza 11

在 React Navigation v5 上,你有所有的解释:

https://reactnavigation.org/docs/nesting-navigators#navigating-to-a-screen-in-a-nested-navigator

路线定义

function Root() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="Profile" component={Profile} />
      <Stack.Screen name="Settings" component={Settings} />
    </Stack.Navigator>
  );
}

function App() {
  return (
    <NavigationContainer>
      <Drawer.Navigator>
        <Drawer.Screen name="Home" component={Home} />
        <Drawer.Screen name="Root" component={Root} />
      </Drawer.Navigator>
    </NavigationContainer>
  );
}
Run Code Online (Sandbox Code Playgroud)

操作说明

navigation.navigate('Root', { screen: 'Settings' });
Run Code Online (Sandbox Code Playgroud)

  • 但是如果我想从另一个堆栈返回到另一个堆栈怎么办?我尝试了 from 技术,它有效,但后退箭头/后退按钮消失在我导航回来的屏幕中。 (4认同)

Cam*_*CHN 7

React Navigation v5 中,您可以执行以下操作:

navigation.navigate('Root', {
  screen: 'Settings',
  params: {
    screen: 'Sound',
    params: {
      screen: 'Media',
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

在上述情况下,您要导航到媒体屏幕,它位于嵌套在声音屏幕内的导航器中,它位于嵌套在设置屏幕内的导航器中。


小智 6

反应导航 v6


文档

function Home() {
  return (
    <Tab.Navigator>
      <Tab.Screen name="Feed" component={Feed} />
      <Tab.Screen name="Messages" component={Messages} />
    </Tab.Navigator>
  );
}

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen
          name="Home"
          component={Home}
          options={{ headerShown: false }}
        />
        <Stack.Screen name="Profile" component={Profile} />
        <Stack.Screen name="Settings" component={Settings} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}
Run Code Online (Sandbox Code Playgroud)
navigation.navigate('Home', { screen: 'Messages' });
Run Code Online (Sandbox Code Playgroud)

  • 在我的主堆栈上,如果我的初始路线是 Feed,并且我使用了此技术,那么我无法再转到 Feed 堆栈了。 (10认同)