react导航检查上一个屏幕是否存在

IT技术 javascript reactjs react-native react-navigation
2021-04-02 20:43:06

我正在拼命寻找检查 ReactNavigation 中是否存在前一个屏幕的可能性。

如果不存在以前的路线,则使用this.props.navigation.goBack()返回false,但我不能使用它,因为如果存在以前的路线,我会被重定向。

是否可以检查我是否打开了应用程序而不是从另一个屏幕导航到主屏幕?

谢谢你。我没有使用 Redux。它会使这些东西更容易,但我现在想避免使用它。

5个回答

什么可能是解决方案(不确定它是最好的)是在前一个屏幕的 param 对象中花费。这样,如果 params 存在就意味着前一个屏幕存在。

例如:

const navigateAction = NavigationActions.navigate({
  routeName: 'Profile',

  params: { previous_screen: 'CURRENT_SCREEN' },

  action: NavigationActions.navigate({ routeName: 'NEXT_SCREEN' }),
});

this.props.navigation.dispatch(navigateAction);

然后在下一个屏幕中:

const { navigation } = this.props;
if (navigation.state.params && navigation.state.params.previous_screen) {
  // A previous screen exists
} else {
  // No previous screen
}

有一个更简单的方法:

if(this.props.navigation.isFirstRouteInParent()) {
    //a previous screen does not exist
} else {
    //a previous screen does exist
}
这个解决方案在大多数情况下已经足够好了,但是如果我需要将第一条路由推入堆栈而不是 goBack to 呢?
2021-06-14 20:43:06

从 React Navigation 5 开始,您可以通过useNavigationState这种方式在功能组件中使用钩子:

const routesLength = useNavigationState(state => state.routes.length);
console.log('routesLength', routesLength);

如果routesLength> 1 那么它不是堆栈中的第一个屏幕

或者你可以使用 navigation.canGoBack()

const navigateAction = NavigationActions.navigate({
  routeName: 'NEXT_SCREEN',
  action: NavigationActions.navigate({ routeName: 'NEXT_SCREEN', params: { previous_screen: 'CURRENT_SCREEN' } }),
});
this.props.navigation.dispatch(navigateAction);
你很可能已经回答了这个问题,但一些关于你如何回答的评论将对未来的读者有益
2021-05-23 20:43:06
请提供一段代码的简要说明。
2021-06-19 20:43:06

它完全适合我.... 如果您想从 React Native 应用程序的导航堆栈中找出以前的路线/屏幕名称,以便您可以使用此功能。

export const previousRouteName = (navigation) =>{
  let navRoutes = navigation.dangerouslyGetParent().state.routes;
  if (navRoutes.length >= 2){
    return navRoutes[navRoutes.length - 2].routeName
  }
  return navigation.state.routeName
}

如何使用?

previousRouteName(props.navigation);

希望你喜欢 K00L 对你有帮助 ;)