众所周知,在多页面应用程序中,页面的跳转是经过路由或导航器来实现的。在0.44版本以前,开发者能够直接使用官方提供的Navigator组件来实现页面的跳转,不过从0.44版本开始,Navigator被官方从react native的核心组件库中剥离出来,放到react-native-deprecated-custom-components的模块中。
若是开发者须要继续使用Navigator,则须要先使用yarn add react-native-deprecated-custom-components命令安装后再使用。不过,官方并不建议开发者这么作,而是建议开发者直接使用导航库react-navigation。react-navigation是React Native社区很是著名的页面导航库,能够用来实现各类页面的跳转操做。
目前,react-navigation支持三种类型的导航器,分别是StackNavigator、TabNavigator和DrawerNavigator。具体区别以下:java
须要说明的是,因为react-navigation在3.x版本进行了较大的升级,因此在使用方式上与2.x版本会有不少的不一样。
和其余的第三方插件库同样,使用以前须要先在项目汇中添加react-navigation依赖,安装的命令以下:react
yarn add react-navigation //或者 npm install react-navigation --save
安装完成以后,能够在package.json文件的dependencies节点看到react-navigation的依赖信息。npm
"react-navigation": "^3.8.1"
因为react-navigation依赖于react-native-gesture-handler库,因此还须要安装react-native-gesture-handler,安装的命令以下:json
yarn add react-native-gesture-handler //获取 npm install --save react-native-gesture-handle
同时,因为react-native-gesture-handler须要依赖原生环境,因此在须要使用link命令连接原生依赖,命令以下:react-native
react-native link react-native-gesture-handler
为了保证react-native-gesture-handler可以成功的运行在Android系统上,须要在Android工程的MainActivity.java中添加以下代码:ide
public class MainActivity extends ReactActivity { ... @Override protected ReactActivityDelegate createReactActivityDelegate() { return new ReactActivityDelegate(this, getMainComponentName()) { @Override protected ReactRootView createRootView() { return new RNGestureHandlerEnabledRootView(MainActivity.this); } }; } }
而后,就可使用react-navigation进行页面导航功能开发,如图7-12所示,是使用createStackNavigator实现页面导航的示例。
在createStackNavigator模式下,为了方便对页面进行统一管理,首先新建一个RouterConfig.js文件,并使用createStackNavigator注册页面。对于应用的初始页面还须要使用initialRouteName进行申明。同时,导航器栈还须要使用createAppContainer函数进行包裹。例如:函数
import {createAppContainer,createStackNavigator} from 'react-navigation'; import MainPage from './MainPage' import DetailPage from "./DetailPage"; const AppNavigator = createStackNavigator({ MainPage: MainPage, DetailPage:DetailPage },{ initialRouteName: "MainPage", }, ); export default createAppContainer(AppNavigator);
其中,createStackNavigator用于配置栈管理的页面,它支持的配置选项有:动画
最后,在入口文件中以组件的方式引入StackNavigatorPage.js文件便可。例如:this
import StackNavigatorPage from './src/StackNavigatorPage' export default class App extends Component<Props> { render() { return ( <StackNavigatorPage/> ); } }
要实现页面的栈管理功能或跳转功能,还须要再至少新建两个子页面,例如MainPage.js和DetailPage.js。url
export default class MainPage extends PureComponent { static navigationOptions = { header: null, //默认页面去掉导航栏 }; render() { const {navigate} = this.props.navigation; return ( <View> <TouchableOpacity onPress={() => { navigate('DetailPage')}}> <Text style={styles.textStyle}>跳转详情页</Text> </TouchableOpacity> </View> ); } } export default class DetailPage extends PureComponent { static navigationOptions = { title: '详情页', }; render() { let url = 'http://www.baidu.com'; return ( <View> <WebView style={{width:'100%',height:'100%'}} source={{uri: url}}/> </View> ); } }
除了示例中使用到的navigationOptions属性,StackNavigator导航器支持的navigationOptions属性还包括:
除了能够实现路由管理和页面跳转操做外,还可使用react-navigation实现顶部和底部的Tab切换,如图7-13所示。
若是要实现底部选项卡切换功能,能够直接使用react-navigation提供的createBottomTabNavigator接口,而且此导航器须要使用createAppContainer函数包裹后才能做为React组件被正常调用。例如:
import React, {PureComponent} from 'react'; import {StyleSheet, Image} from 'react-native'; import {createAppContainer, createBottomTabNavigator} from 'react-navigation' import Home from './tab/HomePage' import Mine from './tab/MinePage' const BottomTabNavigator = createBottomTabNavigator( { Home: { screen: Home, navigationOptions: () => ({ tabBarLabel: '首页', tabBarIcon:({focused})=>{ if(focused){ return( <Image/> //选中的图片 ) }else{ return( <Image/> //默认图片 ) } } }), }, Mine: { screen: Mine, navigationOptions: () => ({ tabBarLabel: '个人', tabBarIcon:({focused})=>{ … } }) } }, { //默认参数设置 initialRouteName: 'Home', tabBarPosition: 'bottom', showIcon: true, showLabel: true, pressOpacity: 0.8, tabBarOptions: { activeTintColor: 'green', style: { backgroundColor: '#fff', }, } } ); const AppContainer = createAppContainer(BottomTabNavigator); export default class TabBottomNavigatorPage extends PureComponent { render() { return ( <AppContainer/> ); } }
固然,除了支持建立底部选项卡以外,react-navigation还支持建立顶部选项卡,此时只须要使用react-navigation提供的createMaterialTopTabNavigator便可。若是要使用实现抽屉式菜单功能,还可使用react-navigation提供的createDrawerNavigator。