如果我从一个页面回到另一个页面,导航.navigate()、导航.push()、导航.goBack()和导航.popToTop()有什么区别?

问题描述 投票:1回答:1

这个这个我了解到,这两者之间存在着有意义的区别。navigation.navigate()navigation.push(). 尽管如此,我还是想知道我是否可以使用 navigation.navigate()navigation.push() 而不是 navigation.goBack()navigation.popToTop().

在我的案例中,有一个页面,导航中包含一些参数。(即通过 navigation.navigate(param, {...})navigation.push(param, {...}). 当我移动到另一个页面时,变量发生了一些变化,现在我想把带有新数据的param发回首页。我考虑过这样做 navigation.navigate(param, {...})navigation.push(param, {...}) 看起来我又不能用 goBack()popToTop()根据 这个

我查过了 这个但我并不是100%确定,因为我认为如果用户多次进行上述操作,页面可能会堆积很多。

react-native react-navigation
1个回答
2
投票

让我们举个例子

想象一下,你的堆栈中有A、B、C三个屏幕,A是主屏幕,实际的堆栈将是一个对象,但为了便于理解,我使用一个简单的数组。

当你启动堆栈时,堆栈将是[A]。

当你做一个导航到B的时候,堆栈将是[A,B]。

如果你把C从B推到堆栈,那么它将是[A,B,C]。

现在所有这些都很常见,但现在如果你从C做一个导航到B,那么它将卸载C,回到B,堆栈将是[A,B]。

如果你选择了push,那么它将添加一个新的屏幕到堆栈,堆栈将是[A,B,C,B]注意push总是添加一个新的屏幕到堆栈。

忽略push,假设堆栈是[A,B,C]现在如果你从C处返回,那么它将像导航方法一样弹出并返回到B处。

但是如果你做popToTop,它将会同时解除C和B的挂载,使堆栈看起来像这样[A]。

不同的是,goBack和popToTop并不像navigate和push那样传递参数。

有一种方法可以使用navigate和useNavigationState实现popToTop和goBack同样的结果。

useNavigationState钩子将获得当前的导航状态,其中包含堆栈中所有屏幕的信息。导航状态值的示例如下

{
  stale: false,
  type: 'stack',
  key: 'stack-A32X5E81P-B5hnumEXkbk',
  index: 1,
  routeNames: ['Home', 'Details', 'MyView', 'ExtView'],
  routes: [
    { key: 'Home-y6pdPZOKLOPlaXWtUp8bI', name: 'Home' },
    {
      key: 'MyView-w-6PeCuXYrcxuy1pngYKs',
      name: 'MyView',
      params: { itemId: 86, otherParam: 'anything you want here' },
    },
  ],
}

如你所见,你可以选择使用这些信息导航到堆栈中的任何屏幕。导航方法也可以像下面一样使用

navigation.navigate({ key: navState.routes[0].key, params: { id: 12 } })

如果你使用0号键,那么你会被带入到根目录下,同时还有一个参数,它会解除中间的屏幕。

如果你想回到过去,你可以简单地做一个index - 1,这将产生与goBack相同的效果。

navigation.navigate({ key: navState.routes[navState.Index-1].key, params: { id: 12 } })

所以你的要求可以实现。

© www.soinside.com 2019 - 2024. All rights reserved.