React Navigation——在头部菜单中使用组件方法
在 React Native 开发中,路由的跳转不再是 Web 世界里面的常用的 React Router,而是 React Navigation。
今天介绍一下在 React Navigation 中如何在头部 (header) 调用 React 组件中的方法。
Navigator——导航器
React Navigation 可以创建多种Navigator
(导航器),有通过页签控制页面跳转的TabNagivator
(页签导航器),还有通过侧边栏进行页面跳转的DrawerNavigator
(抽屉导航器),但最为常用的导航器是StackNavigator
(堆栈导航器),它控制着普通页面之间的跳转。
在StackNavigator
的navigationOptions
(导航配置项)中,可以设置页面的Header
信息,包括头部中的标题,标题的样式,头部左半部分和头部的右半部分等。
页面头部的左半部分一般是返回按钮,而右半部分一般用来展示一些额外操作,比如保存
或者下一步
等,以微信的朋友圈页面为例,请见下图:
问题描述
Navigator
的navigationOptions
一般作为页面组件的静态属性存在,而在静态属性中没办法直接调用组件中的方法,示例代码如下:
1 | class Foo extends React.Component { |
示例代码中页面的headerMode
为screen
,表示页面会附加一个 header,这个 header 与页面是同时存在或消失。
headerLeft
表示左边的返回按钮,可以调用方法参数navigation
的goBack
方法返回到上一页。
而在headerRight
需要调用组件中的doSomething
方法,但因为navigationOptions
是静态属性,所以没办法通过this
关键字来得到doSomething
方法,那么我们要怎么做才可以调用组件里面的方法呢?
解决思路
我们先来看下navigationOptions
的方法参数navigation
对象,看看这个对象里面有哪些东西可以帮到我们,下面列举了该对象几个主要的属性:
- navigate:方法,可以跳转到其他页面
- goBack:方法,返回上一页
- state - 对象,包含了当前路由的名称,key 值和路由参数的一个对象
- setParams - 方法,在路由中设置传递参数
- getParam - 方法,在路由中获取参数
我们看到state
属性包含了路由参数,而setParams
方法可以设置路由参数,那么只要我们将组件中的方法通过setParams
设置到路由参数里面,然后在state
中就可以获取到组件的方法了。
还有一个问题,我们在什么时候将组件方法设置到路由参数里面比较好呢?在几个 React 生命周期方法中,componentWillMount
和componentDidMount
都适合做这件事,但componentWillMount
方法 React 官方已不推荐使用,所以我们这里用componentDidMount
。
实现方法
我们在之前的代码上做一下扩展:
1 | class Foo extends React.Component { |
我们在componentDidMount
中将doSomething
方法设置到路由参数中,然后在navigationOptions
中通过navigation.state.params
就可以获取到该方法了,也可以通过navigation.getParam
方法来获取路由参数。
总结
React Navigation 是 React Native 开发中的一个重要角色,而且最近也升级到了 2.0,很多功能特性都得到了增强和改善。这里只是介绍了开发过程中遇到的一个小坑,希望能对遇到同样问题的同学有所帮助。