React-native 路由 Navigation 各种方法

前言

在移动APP中,我们经常会遇到登陆成功,或者注销后,不允许返回上一页面,这就需要我们清楚栈中的其余view, RN中我们应该如何处理呢?

方法

主要原理是借助于onDidFocus和immediatelyResetRouteStack两个方法实现。

对此我们先看看Navigator提供给我们默认的方法有哪些?

  • getCurrentRoutes() - 获取当前栈里的路由,也就是push进来,没有pop掉的那些。
  • jumpBack() - 跳回之前的路由,当然前提是保留现在的,还可以再跳回来,会给你保留原样。
  • jumpForward() - 上一个方法不是调到之前的路由了么,用这个跳回来就好了。
  • jumpTo(route) - 跳转到已有的场景并且不卸载。
  • push(route) - 跳转到新的场景,并且将场景入栈,你可以稍后跳转过去
  • pop() - 跳转回去并且卸载掉当前场景
  • replace(route) - 用一个新的路由替换掉当前场景
  • replaceAtIndex(route, index) - 替换掉指定序列的路由场景
  • replacePrevious(route) - 替换掉之前的场景
  • resetTo(route) - 跳转到新的场景,并且重置整个路由栈
  • immediatelyResetRouteStack(routeStack) - 用新的路由数组来重置路由栈
  • popToRoute(route) - pop到路由指定的场景,在整个路由栈中,处于指定场景之后的场景将会被卸载。
  • popToTop() - pop到栈中的第一个场景,卸载掉所有的其他场景。

在具体使用中,我们需要添加一个onDidFocus属相,然后判断当前路由是否要求重置整个线路。

<Navigator
    ref="navigator"
    initialRoute={{name: 'LaunchView'}}
    renderScene={this.renderScene}
    configureScene={this.configureScene}
    onDidFocus={(route) => {
        if (route.reset) {                    this.refs.navigator.immediatelyResetRouteStack([{ name: route.name }])
        }
}}
/>

使用方法:

this.props.navigator.push({name: 'yourview Name',reset:true});

ok,搞定了!

以下代码为项目中实践所得。

Home.js文件:

componentDidMount() {
        this.onRefresh();
        // this._bootstrapAsync();

        AsyncStorage.getItem(constString.loginStatus).then(value => {
            if (value === 'true'){
                this.props.navigation.navigate('Home');
            } else {
                // 路由重置...
                const resetAction = StackActions.reset({
                    index: 0,
                    actions: [
                        NavigationActions.navigate({routeName: 'Login'}),  //Login 要跳转的路由
                    ],
                });
                this.props.navigation.dispatch(resetAction);
            }
        });
    }

Login.js文件:

 Toast.add('登录成功');

                // 登录成功,保存
                AsyncStorage.setItem(constString.loginStatus, 'true');
                // const resetAction = StackActions.reset({
                //     index: 0,
                //     actions: [
                //         NavigationActions.navigate({routeName: 'BottomTabNavigator'}),  // Login 要跳转的路由
                //     ],
                // });
                // _this.props.navigation.dispatch(resetAction);
                _this.props.navigation.replace('BottomTabNavigator');//replace(route) - 用一个新的路由替换掉当前场景

 

Seting.js文件:

Toast.add('退出成功');

                        AsyncStorage.setItem(constString.loginStatus, 'false');
                        // 跳转到登录页面
                        const resetAction = StackActions.reset({
                            index: 0,
                            actions: [
                                NavigationActions.navigate({routeName: 'Login'}),  //Login 要跳转的路由
                            ],
                        });
                        this.props.navigation.dispatch(resetAction);

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React Native ,可以使用第三方库来实现路由拦截。一个常用的库是 React Navigation,它提供了强大的导航和路由管理功能。 要实现路由拦截,可以使用 React Navigation 提供的导航守卫功能。导航守卫可以在路由变化前或后执行自定义的逻辑。 以下是一个简单的示例,演示如何在 React Native 使用 React Navigation 实现路由拦截: 1. 首先,确保已经安装了 React Navigation: ``` npm install @react-navigation/native ``` 2. 安装所需的导航器(例如 Stack Navigator): ``` npm install @react-navigation/stack ``` 3. 创建一个名为 `NavigationService.js` 的新文件,用于导航拦截逻辑: ```javascript import { NavigationActions } from '@react-navigation/compat'; let navigator; function setTopLevelNavigator(navigatorRef) { navigator = navigatorRef; } function navigate(routeName, params) { navigator.dispatch( NavigationActions.navigate({ routeName, params, }) ); } // 添加其他需要的导航方法 export default { navigate, setTopLevelNavigator, }; ``` 4. 在根组件设置导航器并引用 `NavigationService.js`: ```javascript import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import NavigationService from './NavigationService'; const Stack = createStackNavigator(); function App() { return ( <NavigationContainer ref={navigatorRef => { NavigationService.setTopLevelNavigator(navigatorRef); }}> <Stack.Navigator> {/* 添加其他屏幕 */} </Stack.Navigator> </NavigationContainer> ); } export default App; ``` 5. 在需要拦截的组件使用 `NavigationService.js`: ```javascript import NavigationService from './NavigationService'; // 在需要拦截的地方调用 `NavigationService.navigate` 方法 NavigationService.navigate('ScreenName'); ``` 通过这种方式,你可以在路由变化前后执行自定义的逻辑,例如验证用户权限、处理特定的跳转逻辑等。需要注意的是,这只是一个简单的示例,你可以根据具体的需求进行定制和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值