一、方法简介

1. 应用中的每个页面组件都会自动提供 this.props.navigation

this.props.navigation可以获取的一些方法:

  • navigate - 转到另一个页面, 计算出需要执行的操作  (常用)
  • goBack - 关闭活动屏幕并在堆栈中向后移动  (常用)
  • addListener - 订阅导航生命周期的更新
  • isFocused - 函数返回 true 如果屏幕焦点和 false 否则。
  • state - 当前状态/路由  (常用)
  • setParams - 对路由的参数进行更改  (常用)
  • getParam - 获取具有回退的特定参数  (常用)
  • dispatch - 向路由发送 action  (常用)
  • dangerouslyGetParent - 返回父级 navigator 的函数

注意: this.props.navigation并不是在所有页面(组件)中都可以使用,而是必须在StackNavigator、DrawerNavigator中声明的screen组件,才可以使用this.props.navigation

也就是说,screen组件会自动获得这个props

this.props.navigation 上还有一些方法取决于当前 navigator 的附加函数(StackNavigator 和 DrawerNavigator)

2. 如果是StackNavigator,除了以上方法,this.props.navigation还提供如下的一些方法:

  • push - 推一个新的路由到堆栈  (常用)
  • pop - 返回堆栈中的上一个页面  (常用)
  • popToTop - 跳转到堆栈中最顶层的页面  (常用)
  • replace - 用新路由替换当前路由
  • reset- 操作会擦除整个导航状态,并将其替换为多个操作的结果。  (常用)
  • dismiss - 关闭当前堆栈

3. 如果是DrawerNavigator,除了以上方法,this.props.navigation还提供如下的一些方法:

  • openDrawer - 打开
  • closeDrawer - 关闭
  • toggleDrawer - 切换,如果是打开则关闭,反之亦然

由于笔者没有使用过DrawerNavigator,在此就不做说明;

以上内容均摘自react-navigation的官网,但是官网有点繁琐,写此以自用,有读者也是我的幸运。

二、以上方法的使用

1. this.props.navigation.navigate()

onPress={() => navigate('ProfileScreen', { title: 'Profile' })}

说明:

功能:导航到某个路由 (即跳转页面)

使用:this.props.navigation.navigate(routeName, params, action)

参数:

  • routeName(必需)表示需要导航到的目标路由(即跳转的目标页面),是在StackNavigator 中声明的screen页面的名称
  • params(可选)表示跳转携带的参数,可以使用大括号携带多个,形式是key-value形式,在目标页面使用this.props.navigation.state.params.xxx来获取使用
  • action(可选)不常用,此处不做解释

注意:3.x版本后,需要注意navigate和push的使用差别

Push - 在堆栈顶部添加一条路由,并导航至该路由. 与navigate的区别在于,如果有已经加载的页面,navigate方法将跳转到已经加载的页面,而不会重新创建一个新的页面。 push 总是会创建一个新的页面,所以一个页面可以被多次创建。--摘自官网

2. this.props.navigation.push()

onPress={() => push('ProfileScreen', { title: 'Profile' })}

说明: 功能作用完全同上,只是和navigate的区别需要注意

类似于navigatepush将跳转到堆栈中的新的路由 与navigate的区别在于,如果有已经加载的页面,navigate方法将跳转到已经加载的页面,而不会重新创建一个新的页面。 push 总是会创建一个新的页面,所以一个页面可以被多次创建。--摘自官网

注意:与navigate相比较,push的使用范围无疑是更广的,它可以在相同的screen页面间跳转(只是页面routeName相同,而参数params不同),

3. this.props.navigation.goback()

onPress={() => this.props.navigation.goback()}

说明: 可以返回堆栈的上一页面

功能: 关闭当前页面并返回上一页面

参数:可以是空(即表示仅仅返回上一个页面,并关闭当前页),

      可以有参数,表示回到指定页面(关闭本页面和指定页面之间的所有页面)

扩展:有参数情况的使用

//当前已使用以下导航堆栈:
navigation.navigate(SCREEN_KEY_A);
navigation.navigate(SCREEN_KEY_B);
navigation.navigate(SCREEN_KEY_C);
navigation.navigate(SCREEN_KEY_D); //现在你在* screen D 上,并且想要回到 screen A *(销毁D、C和B)
navigation.goBack(SCREEN_KEY_D)//将从 screen D 跳转到 screen A

注意:

  • 如果,* screen A * 在堆栈的顶部, 你可以使用 navigation.popToTop()方法
  • gaoback()使用的参数,同navigate,应该是在StackNavigator 中声明的screen页面的名称

4. this.props.navigation.popToTop()

onPress={() => this.props.navigation.popToTop()}

说明: 功能同上面的goback(),只是作用更单一,是回到堆栈的顶部

功能: 调用该方法将直接跳转到堆栈最顶层的路由,销毁其它所有页面

5. this.props.navigation.pop()

onPress={() => this.props.navigation.pop()}
//也可以携带参数,n表示在堆栈内返回几层
onPress={() => this.props.navigation.pop(n)}

说明:  功能同上面的goback()、popToTop(),只是参数是不同的

功能: 返回到堆栈中的上一个页面,如果提供一个参数 n,则指定在堆栈内返回几层。

6. this.props.navigation.reset()

import { NavigationActions } from 'react-navigation'
navigation.reset([NavigationActions.navigate({ routeName: 'HomeScreen' })], 0)

说明: this.props.navigation.reset()是重置堆栈,并初始化到指定页面(HomeScreen),也就是清空堆栈,一般在退出登录的情况下操作

功能: 操作会擦除整个导航状态,并将其替换为多个操作的结果。

扩展:也可使用dispatch执行此操作:

import { StackActions, NavigationActions } from 'react-navigation';

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

参数:

  • index - * number *  - 必需 - routes数组中state的活动路由的索引。(此处0表示清空所以,从0开始)
  • actions - array - 必需 - 将取代导航状态的导航行为数组。(即初始化)
  • key - string or null - 可选 - 如果设置,具有给定 key 的导航器将重置。 如果为null,则根导航器将重置。

7. this.props.navigation.dispatch()

import { NavigationActions } from 'react-navigation';

const navigateAction = NavigationActions.navigate({
routeName: 'ProfileScreen',
params: {},
// navigate can have a nested navigate action that will be run inside the child router (navigate 可以用有一个嵌套的navigate 操作)
action: NavigationActions.navigate({ routeName: 'SubProfileRoute' }),
});
this.props.navigation.dispatch(navigateAction);

说明: dispatch() 可以重新定义任何导航操作(比如navigate,push,reset等),上面的reset()方法的扩展也是使用的dispatch

功能: 使用 dispatch 将任何导航操作发送到路由后,该操作都将具有最高优先级。

参数: 就是你想重做的 NavigationActions 或者 StackActions中的方法及其参数

8. this.props.navigation.state

// 页面可以通过 this.props.navigation.state访问其路由。每一个都将返回一个对象, 其内容如下:
{
//StackNavigator中声明的screen名称
routeName: 'profileScreen,
//用于路由排序的唯一标识,对于我们无用
key: 'xxx',
//携带参数
params: { name: 'profile' }
}

说明: state可以获取本页面路由下的数据,尤其是params (可以通过前一页面的跳转携带,也可在本页面通过setParams来设置)

功能:页面可以通过 this.props.navigation.state访问其路由,获取想要的东西,比如params等

使用:this.props.navigation.state.params.title等

// 通过 navigation.state 获取参数 params
static navigationOptions = ({navigation}) => ({
headerTintColor: '#fff',
headerTitle: navigation.state.params.title, //这是从上一级跳转携带的
headerRight: <View>
          <TouchableOpacity onPress={() => {navigation.state.params.toOperate();}}> //此处必须通过添加参数的形式来调用方法
          <View><Text style={{color: '#fff', marginRight: 20}}>下一步</Text></View>
          </TouchableOpacity >
          </View>
})

9. this.props.navigation.setParams()

componentDidMount() {
// toOperate同上面的state.params
this.props.navigation.setParams({toOperate: () => {
alert('操作')
}})
}

说明: setParams()可以设置参数,方便在页面的头部使用(即使用navigationOptions定义的头部,当需要本页面的数据时,必须通过setParams()传递,通过state.params去获取)

功能: setParams方法允许页面更改路由中的参数

10. this.props.navigation.getParam()

// 使用state.params获取
this.props.navigation.state.params.title //使用getParam()获取
this.props.navigation.getParam('title', 'profile');

说明: 过去, 当 params 未定义时, 你可能在获取 params 时遇到问题。 现在,你不必直接访问参数,可以调用 getParam方法。

功能: 获取指定的参数,可以设置获取失败的返回值,比如上面的 title,当获取不到时,使用 profile 作为默认值

三、

最后说明:全文使用 react-navigation官网 的内容,仅为方便理解,添加了个人的删改和解释,如有问题,望见谅。

react-navigation 3.x版本的push、navigate、goback、pop、dispatch等常用方法的更多相关文章

  1. React Navigation / React Native Navigation 多种类型的导航结合使用,构造合理回退栈

    React Navigation 更新到版本5已经是非常完善的一套导航管理组件, 提供了Stack , Tab , Drawer 导航方式 , 那么我们应该怎样设计和组合应用他们来构建一个完美的回退栈 ...

  2. React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方

    以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation  react-native ...

  3. Facebook力推导航库:React Navigation使用详解

    本文来自Songlcy投稿:文章地址:http://blog.csdn.net/u013718120/article/details/72357698 一.开源库介绍 今年1月份,新开源的react- ...

  4. react navigation goBack()返回到任意页面(不集成redux) 一

    方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...

  5. react-native 学习 ----- React Navigation

    很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...

  6. React Native 0.50版本新功能简介

    React Native在2017年经历了众多版本的迭代,从接触的0.29版本开始,到前不久发布的0.52版本,React Native作为目前最受欢迎的移动跨平台方案.虽然,目前存在着很多的功能和性 ...

  7. [RN] 04 - React Navigation

    react-navigation和react-router的对比: 支持的平台: react-navigation: react-native react-router: react-native.r ...

  8. React-native 导航插件React Navigation 4.x的使用

    React-native 导航插件React Navigation 4.x的使用 文档 英文水平可以的话,建议直接阅读英文文档 简单使用介绍 安装插件 yarn add react-navigatio ...

  9. react-native导航器 react navigation 介绍

    开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...

随机推荐

  1. 201621123005《Java程序设计》第十二次作业

    <Java程序设计>第十二次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造 ...

  2. @InitBinder装配自定义编辑器

    @InitBinder装配自定义编辑器 第一步:BaseController.java,标注@InitBinder public class BaseController { @InitBinder ...

  3. PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改

    最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下: # -*- coding: utf-8 -*- ''' [简介] PyQt5中 处理database 例子 ''' import sys fr ...

  4. threejs精灵平面Sprite(类似tip效果)

    效果图:   let center = this.cube.position.clone(), size = this.cube.geometry.boundingBox.getSize(), sca ...

  5. scanf()与gets()的区别

    scanf()与gets()的区别 1.scanf()可以同时接受多个字符串,而gets()一次只能接受一个字符串. #include<stdio.h>int main(){ char s ...

  6. 7-13 求链式线性表的倒数第K项(20 分)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  7. ①Jenkins集成—入门安装使用

    一.什么是Jenkins jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各 ...

  8. bzoj1013球形空间

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1013 根据距离式子,两个点的话,两边平方再消掉x^2之后有: a1^2 - 2*a1*x1 ...

  9. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

  10. WebKit的已实施srcset图像响应属性

    WebKit已经发布了一些官方新闻,终于落实srcset的属性.作为W3C的响应图像社区组的主席,我一直希望这一刻到来有一段时间了.所以,对所有参与方是个好消息,用户浏览网页时的体验是最重要的. 所有 ...