【问题标题】:React Native clear the previous screen from the navigation stackReact Native 从导航堆栈中清除上一个屏幕
【发布时间】:2019-10-23 15:43:15
【问题描述】:

我正在开发一个用于学习目的的 React 本机应用程序。我现在正在使用 React Navigation 实现导航。我正在使用堆栈导航。但我找不到从导航历史记录中删除前一个屏幕并终止应用程序的方法。

我是这样设置导航的。

const AppStack = createStackNavigator({
  Login: {
    screen: Login
  },
  Register: {
    screen: Register
  },
  Events: {
    screen: Events
  }
});

如您在上面的代码中看到的,我默认打开登录屏幕。登录后,我像这样打开“事件”屏幕。

this.props.navigation.navigate('Events');

问题是,当我在事件页面上时,我可以在导航栏中看到返回按钮。当我按下它时,我被带回了登录页面。

但我想要的是,登录后,我想从堆栈中删除登录页面。当我在事件页面上时,当我单击后退按钮时,应用程序应该关闭。也许它可能没有后退按钮。在这种情况下,它就像第一个屏幕一样。我该怎么做?

【问题讨论】:

  • 正在寻找类似但我想导航到第一个屏幕。不要重置所有屏幕。例如,如果用户接受隐私政策并进入权限屏幕,那么我想返回 getstartedscren。和从注册屏幕到开始屏幕类似。

标签: react-native react-navigation react-navigation-stack


【解决方案1】:

你需要的是重置功能

import {NavigationActions} from 'react-navigation';

this.props.navigation.dispatch(NavigationActions.reset({
     index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'Events' })]
 }));

【讨论】:

    【解决方案2】:

    登录或注册成功完成后,您必须重置导航堆栈,如下所示,

    import { StackActions, NavigationActions } from 'react-navigation';
    const resetAction = StackActions.reset({
        index: 0,
        actions: [NavigationActions.navigate({ routeName: 'Events' })],
    });
    this.props.navigation.dispatch(resetAction)
    

    此外,如果您不希望出现标题,则必须在您的 Event 页面中添加一个静态方法。

    static navigationOptions = navigation => ({
            header: null
    });
    

    希望对你有所帮助。

    【讨论】:

    • @Wai Yan Hein 如果它解决了您的问题,请接受答案,以便其他人在以后的使用中得到正确的答案。
    • 嗨,这解决了问题。但我可以要求更多吗?它没有打开带有动画的事件页面。通常它会在 IOS 中打开带有幻灯片动画的新屏幕。
    • 如果你重置堆栈然后它不能动画。动画仅适用于 navigation.navigate
    【解决方案3】:
    import {StackActions, NavigationActions} from 'react-navigation';
    
    this.props.navigation.dispatch(StackActions.reset({
         index: 0, key: null, actions: [NavigationActions.navigate({ routeName: 'Events' })]
     }));
    

    【讨论】:

    • 虽然这个答案可能是最新的,或者在没有任何解释的情况下回答了这个问题,但它仍然是一个低质量的答案。请提供解释,以便其他人学习..
    【解决方案4】:

    从 V5 开始

    this.props.navigation.reset({
            index: 0,
            routes: [{name: 'Events'}],
          });
    

    在功能组件中使用钩子,

    import {useNavigation} from '@react-navigation/native';
    
    const navigation = useNavigation();
    
    navigation.reset({
            index: 0,
            routes: [{name: 'Events'}],
          });
    

    【讨论】:

      【解决方案5】:

      在 V5.x 中,我们有 reset 方法

      navigation.reset({
        index: 0,
        routes: [{ name: 'ScreenName' }],
      });
      

      【讨论】:

        【解决方案6】:

        2021 年更新:

        这里有一个更简单的解决方案:

        this.props.navigation.replace("Events");
        

        这会将当前屏幕替换为新屏幕,同时将所有先前屏幕保留在导航堆栈中。

        值得深思

        理想情况下,您会使用最佳实践并执行以下操作:

        import * as ROUTES from "../routes/constants"
        
        this.props.navigation.replace(ROUTES.EVENTS);
        

        routes/constants.js

        const EVENTS = "Events";
        ...
        
        export {
            EVENTS,
            ...
        };
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2020-02-19
        • 1970-01-01
        • 2018-06-09
        • 2019-07-27
        相关资源
        最近更新 更多