React Native开发之react-navigation库详解

审配
• 阅读 5939

React  Native开发之react-navigation库详解

众所周知,在多页面应用程序中,页面的跳转是通过路由或导航器来实现的。在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。具体区别如下:

  • StackNavigator:包含导航栏的页面导航组件,类似于官方的Navigator组件。
  • TabNavigator:底部展示tabBar的页面导航组件。
  • DrawerNavigator:用于实现侧边栏抽屉页面的导航组件。

需要说明的是,由于react-navigation在3.x版本进行了较大的升级,所以在使用方式上与2.x版本会有很多的不同。
和其他的第三方插件库一样,使用之前需要先在项目汇中添加react-navigation依赖,安装的命令如下:

yarn add react-navigation
//或者
npm install react-navigation --save

安装完成之后,可以在package.json文件的dependencies节点看到react-navigation的依赖信息。

"react-navigation": "^3.8.1"

由于react-navigation依赖于react-native-gesture-handler库,所以还需要安装react-native-gesture-handler,安装的命令如下:

yarn add react-native-gesture-handler
//获取
npm install --save react-native-gesture-handle

同时,由于react-native-gesture-handler需要依赖原生环境,所以在需要使用link命令链接原生依赖,命令如下:

react-native link react-native-gesture-handler

为了保证react-native-gesture-handler能够成功的运行在Android系统上,需要在Android工程的MainActivity.java中添加如下代码:

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实现页面导航的示例。
React  Native开发之react-navigation库详解
在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用于配置栈管理的页面,它支持的配置选项有:

  • path:路由中设置的路径映射配置。
  • initialRouteName:设置栈管理方式的默认页面,且此默认页面必须是路由配置中的某一个。
  • initialRouteParams:初始路由参数。
  • defaultNavigationOptions:用于配置导航栏的默认导航选项。
  • mode:定义渲染和页面跳转的样式,选项有card和modal,默认为card。
  • headerMode:定义返回上级页面时动画效果,选项有float、screen和none。

最后,在入口文件中以组件的方式引入StackNavigatorPage.js文件即可。例如:

import StackNavigatorPage from './src/StackNavigatorPage'

export default class App extends Component<Props> {
  render() {
    return (
      <StackNavigatorPage/>
    );
  }
}

要实现页面的栈管理功能或跳转功能,还需要再至少新建两个子页面,例如MainPage.js和DetailPage.js。

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属性还包括:

  • header:设置导航属性,如果设置为null则隐藏顶部导航栏。
  • headerTitle:设置导航栏标题。
  • headerBackImage:设置后退按钮的自定义图片。
  • headerBackTitle:设置跳转页面左侧返回箭头后面的文字,默认是上一个页面的标题。
  • headerTruncatedBackTitle:设置上个页面标题不符合返回箭头后面的文字时显示的文字。
  • headerRight:设置导航栏右侧展示的React组件。
  • headerLeft:设置标题栏左侧展示的React组件。
  • headerStyle:设置导航条的样式,如背景色、宽高等。
  • headerTitleStyle:设置导航栏的文字样式。
  • headerBackTitleStyle:设置导航栏上【返回】文字的样式。
  • headerLeftContainerStyle:自定义导航栏左侧组件容器的样式,例如增加padding值。
  • headerRightContainerStyle:自定义导航栏右侧组件容器的样式,例如增加 padding值。
  • headerTitleContainerStyle:自定义 导航栏标题组件容器的样式,例如增加 padding值。
  • headerTintColor:设置导航栏的颜色。
  • headerPressColorAndroid:设置导航栏被按下时的颜色纹理,Android需要版本大于5.0。
  • headerTransparent:设置标题背景是否透明。
  • gesturesEnabled:设置是否可以使用手势关闭当前页面,iOS默认开启,Android默认关闭。

除了可以实现路由管理和页面跳转操作外,还可以使用react-navigation实现顶部和底部的Tab切换,如图7-13所示。
React  Native开发之react-navigation库详解
如果要实现底部选项卡切换功能,可以直接使用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。

附:
react-navigation官网

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
springMVC实现登陆
页面打开跳转到登陆页面登陆成功跳转到成功页面登陆失败再次返回登录页面,并增加提示信息1、首页跳转到登陆页面  Tomcat服务器启动时默认加载WEBINF下的index.jsp,可以通过修改xml配置的方式来改变Tomcat这一默认行为。这里使用springMVC来实现这个功能。  第一种实现
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
ReactNative页面跳转Navigator
ReactNative页面跳转NavigatorNavigator即导航器,通过导航器我们可以实现应用在不同的页面之间进行跳转。 导航器会建立一个路由栈,用来弹出,推入或者替换路由状态。该路由栈相当于android原生中使用的任务栈。renderScene该方法就相当
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
鸿蒙小林 鸿蒙小林
2个月前
《仿盒马》app开发技术分享-- 订单详情页(32)
技术栈Appgalleryconnect开发准备在之前的章节中我们实现了订单的提交,以及提交之后跳转到确认订单页面,在确认订单页面我们添加了一个入口,这个入口是查询订单,当我们点击入口时,我们需要跳转到一个新的界面,这个界面通过接收上个界面的订单id或者订
审配
审配
Lv1
你在我这里无法保存,因为你过于庞大,内存不足。
文章
4
粉丝
0
获赞
0