ReactNative系列(四):react-navigation 3.x全解(上)

ReactNative.jpg

ReactNative整理:《ReactNative系列》

内容目录

1. react-navigation简介
2. react-navigation详解
 2.1 安装react-navigation
 2.2 StackNavigator -- 堆栈式导航
 2.3 SwitchNavigator -- 单页式导航
 2.4 TabNavigator -- 标签式导航
 2.5 DrawerNavigator -- 抽屉式导航
3. 结束


一、react-navigation简介

 移动应用基本上不会由单个页面组成。管理多个页面的呈现、跳转的组件,就是我们所说的导航器(Navigator)。
 React Navigation 源于 React Native 社区对一个可扩展且易于使用的导航解决方案的需求,它完全使用 JavaScript 编写。是社区今后主推的导航库。到现在为止已经维护到3.x版本。
react-navigation导航器类型包括:StackNavigator、TabNavigator、DrawerNavigator、SwitchNavigator、BottomTabNavigator和MaterialTabNavigator。创建导航器的方法变成了以create开头,例如:创建StackNavigator需要用createStackNavigator,其余类似。
几种重要导航:

  • StackNavigator:堆栈式导航器,利用栈管理页面的顶部导航栏,用作页面跳转和参数传递。
  • SwitchNavigator:单页式导航器,一次只显示一个页面。默认情况下,不处理返回操作,并在切换时将路由重置为默认状态。
  • TabNavigator:标签式导航器,底部tabBar标签区分模块,同一页面中可以点击切换不同模块。英文文档有说明,在3.X版本中,该导航器已经被删除,请用createBottomTabNavigator或createMaterialTopTabNavigator来代替。
  • DrawerNavigator: 抽屉式导航器,侧滑菜单切换页面。

下面的内容也是围绕这四个导航类型来展开。建议大家看英文文档,相比中文文档要更准确点,同时也锻炼英文阅读能力。

ReactNavigation官方文档:《React Navigation》

二、react-navigation使用

1. 安装react-navigation

// 如果有安装Yarn工具
yarn add react-navigation
// or with npm
// npm install --save react-navigation

然后,需要安装react-native-gesture-handler

yarn add react-native-gesture-handler
// or with npm
// npm install --save react-native-gesture-handler

之后,Link链接到原生依赖。

react-native link react-native-gesture-handler

2. StackNavigation -- 堆栈式导航

简单来说,StackNavigation是一种以栈形式来管理页面的页面切换方式,默认配置下,具有熟悉的Android和iOS感觉&外观。的特性是先进后出,所以最新生成的页面push入栈后,会在最顶层。

(1) API定义

// 需要两个配置参数对象
createStackNavigator(RouteConfigs, StackNavigatorConfig);

(2) RouteConfigs(路由配置对象)
路由配置对象是从路由名称到路由配置的映射,它告诉导航器该路由呈现的内容。

  • screen - 路由页面必须有的属性,表示内容页面名称,是一个React组件。
  • path - 深度链接路径或者在web页面跳转APP时会用到。
  • navigationOptions - 用于导航器内部页面的配置对象。

(3) StackNavigatorConfig (导航器配置对象)
路由选项:

  • initialRouteName - 设置导航器的默认页面,必须是路由配置中的某一个。
  • initialRouteParams - 初始路由的参数。
  • initialRouteKey - 初始路由的可选标识符。
  • defaultNavigationOptions - 用于屏幕的默认导航选项。
  • paths - 覆盖路由配置中设置的路径的映射。

视觉选项:

  • mode - 定义渲染和转换的样式:
    • card - 使用标准的 iOS 和 Android 屏幕转换, 这是默认设置。
    • modal - 页面从屏幕底部滑入,这是iOS的常用模式, 只在 iOS 上生效,在 Android 上无效。
  • headerMode - 指定页眉的呈现方式:
    • float - 呈现一个位于顶部的单个页眉, 并在屏幕被更改时进行动画显示, 这是 iOS 上常见的模式。
    • screen - 每个屏幕都有一个标头, 并且页眉随屏幕一起淡入和淡出, 这是 Android 的常见模式。
    • none - 不会呈现页眉。
  • headerBackTitleVisible - 提供合理的默认值以确定后退按钮标题是否可见,但如果要覆盖它,则可以使用true或false在此选项中。
  • headerTransitionPreset - 在headerMode: float启用的情况下,指定标题在屏幕切换时的过渡方式。
    • fade-in-place - Header组件在不移动的情况下淡入淡出,类似iOS应用的Twitter, Instagram和Facebook。这个是默认值。
    • uikit - iOS默认行为的近似值(不懂这个是啥意思~~)。
  • headerLayoutPreset - 指定Header组件的布局方式:
    • left - 将标题锚定在左侧,靠近返回键或其他左侧组件。在Android上是默认的。当在iOS上使用时,Header组件的返回标题是隐藏的,左侧组件的内容会溢出到标题下方,如果需要调整,可以用headerLeftContainerStyleheaderLeftContainerStyle两个属性。此外,该属性与headerTransitionPreset:uikit不兼容。
    • center - 标题居中,在iOS上是默认值。
  • cardStyle - 用这个属性覆盖或扩展堆栈中单个Card的默认样式。
  • cardShadowEnabled - 使用这个属性在转换的时候会展示可见的阴影。默认是true
  • cardOverlayEnabled - 使用这个属性在切换时显示堆栈卡片浮层。默认是false
  • transitionConfig - 返回一个合并默认屏幕切换效果的对象的函数。提供的函数将传递一下参数:
    • transitionProps - 新屏幕的过渡道具。
    • prevTransitionProps - 旧屏幕过渡道具。
    • isModal - 布尔值,指定屏幕是否为模态。
  • onTransitionStart - 当卡转换动画即将开始时调用的函数。
  • onTransitionEnd - 在卡转换动画完成后调用的函数。
  • transparentCard - 该属性能够保持堆栈中所有卡片可见,并添加一个透明背景而不是白色的。这对于像实现模式对话框是很有用的,前面的场景在当前场景下方仍然是可见的。

(4) navigationOptions - 用于导航内部的页面配置
属性值太多,这里只列举一部分,有兴趣的可以去官网对照,

  • title - 可以用作HeaderTitle回退的字符串。此外,将被用作tabBarLabel的回退(如果嵌套在TabNavigator中),或者drawerLabel(如果嵌套在DrawerNavigator中)。会在导航栏和标签栏中都生效。
  • header - 返回一个React元素,显示为标题。设置null会隐藏标题。
  • headerTitle - 可以是字符串、React元素或React组件,默认为场景标题。使用组件时,它能接收allowFontScalingstylechildren为属性值。标题字符串通过children属性传入。
  • headerTitleAllowFontScaling - Header标题字体是否缩放以符合系统设置的文字大小。默认值是true
  • headerBackImage - 用React元素或组件展示自定义返回按钮的图片。使用组件时,接收许多属性值用作渲染(如:tintColortitle)。
  • headerBackTitle - iOS上返回键使用的标题字符串,或者用null会禁用标签。默认为上一个场景标题。该属性必须在初始屏幕中定义,不能在目标页面中定义。
  • headerTruncatedBackTitle - 当headerBackTitle属性不适配屏幕时(内容过多),返回按钮会用该属性标题字符串。默认是Back
  • gesturesEnabled - 是否可以用手势关闭当前页面,iOS上默认为true,Android上默认为false
  • gestureResponseDistance - 用于覆盖从屏幕便于开始识别手势距离的对象。它有以下属性:
    • horizontal - number - 水平方向的距离。默认为25。
    • vertical - number - 垂直方向的距离。默认为135。
  • gestureDirection - 用来覆盖关闭手势方向的字符串。default是正常行为,inverted是从右向左滑动。

3. SwitchNavigator -- 单页式导航

SwitchNavigator的用途是一次只显示一个页面。默认情况下,它不处理返回操作,并在页面切换的时候将路由重置为默认状态。该导航器适合用于首页需要广告或者需要安全验证的场景。

(1) API定义

createSwitchNavigator(RouteConfigs, SwitchNavigatorConfig);

(2) RouteConfigs(路由配置对象)
路由配置对象是从路由名称到路由配置的映射,它告诉导航器该路由呈现的内容。具体属性值可以参照createStackNavigator,两者类似。

(3) SwitchNavigatorConfig (导航配置对象)
有几个传递给底层路由器以修改路由逻辑的选项:

  • initialRouteName - 首次加载时初始选项卡路由的路由名称。
  • navigationOptions - 航器本身的导航选项,用于配置父导航器。
  • defaultNavigationOptions - 用于屏幕的默认导航选项。
  • resetOnBlur - 从屏幕切换时重置任何嵌套导航器的状态。默认值是true
  • paths - 提供RouteName到路径配置的映射,该映射会覆盖RouteConfigs中设置的路径值。
  • backBehavior - initialRoute返回到初始路由,order返回到上一个路由,history返回上次访问路线的历史记录,或者none

4. TabNavigator -- 标签式导航

TabNavigator在3.x版本中已经被移除,用createBottomTabNavigatorcreateMaterialTopTabNavigator来代替。

4.1 BottomTabNavigator -- 底部标签导航
 页面底部的标签栏,可以在不同路由之间切换。路由会懒加载,屏幕组件只有在第一次获取焦点时才会加载。

(1) API定义

createBottomTabNavigator(RouteConfigs, BottomTabNavigatorConfig);

(2) RouteConfigs(路由配置对象)
还是和上面一样,参照createStackNavigator属性配置。

(3) BottomTabNavigatorConfig (导航配置对象)

  • initialRouteName - 首次加载时初始选项卡路由的路由名称。
  • navigationOptions - 导航器本身的导航选项,用于配置父导航器。
  • defaultNavigationOptions - 用于屏幕的默认导航选项。
  • resetOnBlur - 屏幕切换时重置任何嵌套导航器的状态。默认为false
  • order - 定义选项卡顺序的路由名称数组。
  • paths - 提供RouteName到路径配置的映射,该映射会覆盖RouteConfigs中设置的路径值。
  • backBehavior - initialRoute返回到初始路由,order返回到上一个路由,history返回上次访问路线的历史记录,或者none
  • lazy - 默认为true。如果为false,则立即呈现所有选项卡。如果为true,则仅当选项卡第一次处于活动状态时才会呈现选项卡。注意:以后访问时不会重新呈现选项卡。
  • tabBarComponent - 可选,覆盖要用作选项卡栏的组件。
  • tabBarOptions - 具有以下属性的对象:
    • activeTintColor - 活动选项卡的标签和图标颜色。
    • activeBackgroundColor - 活动选项卡的背景色。
    • inactiveTintColor - 非活动选项卡的标签和图标颜色。
    • inactiveBackgroundColor - 非活动选项卡的背景色。
    • showLabel - 是否显示选项卡的标签,默认值为true
    • showIcon - 是否显示选项卡的图标,默认值为true
    • style - 选项卡栏的样式对象。
    • labelStyle - 选项卡标签的样式对象。
    • tabStyle - 选项卡的样式对象。
    • allowFontScaling - 标签字体是否应缩放以符合文本大小辅助功能设置,默认值为true
    • adaptive - 选项卡图标和标签对齐方式是否应根据屏幕大小更改?对于iOS 11,默认为true。如果为false,则选项卡图标和标签始终垂直对齐。如果为true,则选项卡图标和标签在区域上水平对齐。
    • safeAreaInset - 覆盖SafeAreaView组件的forceInset属性,默认值是{ bottom: 'always', top: 'never' }。可用的key值有topbottomleftright,提供的value值有alwaysnever

(4) navigationOptions - 用于导航内部的页面配置

  • title - 可用作HeaderTitle和TabbarLabel回退的通用标题。
  • tabBarVisible - truefalse以显示或隐藏选项卡栏,如果不设置则默认为true
  • tabBarIcon - React元素或给定{ focused: boolean, horizontal: boolean, tintColor: string }返回React.Node的函数,展示在选项卡栏中。设备处于横向时horizontal属性是true,纵向时为false。每当设备方向改变时,图标都会重新渲染。
  • tabBarLabel - 在选项卡栏或React元素中显示的选项卡的标题字符串,或给定{ focused: boolean, tintColor: string }返回要在选项卡栏中显示的react.node的函数。未定义时,将使用场景title。要隐藏,请参见上一节中的TabBarOptions.ShowLabel。
  • tabBarButtonComponent - React组件包裹着图标和标签并实现onPress方法。默认值是一个围绕TouchableWithOutFeedback的包装器,使其成为行为与其他触摸事件相同。TabbarButtonComponent:TouchableOpacity将改用TouchableOpacity。
  • tabBarAccessibilityLabel - 选项卡按钮的辅助功能标签。当用户点击选项卡时,屏幕阅读器将读取此信息。如果选项卡没有标签,建议设置此选项。
  • tabBarTestID - 在测试中定位此选项卡按钮的ID。
  • tabBarOnPress - 用于处理点击事件的回调,用于在转换到下一个场景(点击的场景)开始之前添加自定义逻辑;参数是一个包含以下内容的对象:
    • navigation - 屏幕导航属性。
    • defaultHandler - 选项卡按下的默认处理。
  • tabBarOnLongPress - 用于处理长按事件的回调;参数是一个包含以下内容的对象:
    • navigation - 屏幕导航属性。
    • defaultHandler - 选项卡按下的默认处理。

4.2 MaterialTopTabNavigator -- 顶部标签导航
 屏幕顶部以材料设计为主题的选项卡栏,可通过点击路线或水平滑动在不同路线之间切换。默认情况下,转换是动态的。每个路由的屏幕组件会立即装载。

(1) API定义

createMaterialTopTabNavigator(RouteConfigs, TabNavigatorConfig);

(2) RouteConfigs(路由配置对象)
依旧参照createStackNavigator属性配置。

(3) TabNavigatorConfig (导航配置对象)
BottomTabNavigatorConfig类似,里面的很多相同属性这里就不再重复了,只说几个不同属性:

  • tabBarPosition - 标签栏的位置, 可以是topbottom。默认值是top
  • swipeEnabled - 是否允许在标签页之间进行滑动。
  • animationEnabled - 是否在更改标签页时进行动画处理。
  • optimizationsEnabled - 是否将场景包装到ResourceSavingScene中,以便在场景未聚焦后将其移出屏幕,从而提高内存使用率。
  • initialLayout - 可传递包含初始heightwidth的可选对象,以防止在react-native-tab-view视图渲染中出现单帧延迟。

(4) navigationOptions - 用于导航内部的页面配置
同样,该配置对象中相同的属性就不再这里重复了,只介绍不同的属性。

  • swipeEnabled - 如果为truefalse,则启用或禁用选项卡之间的滑动,如果未设置,则默认为TabNavigatorConfig选项中swipeEnabled

5. DrawerNavigator -- 抽屉式导航

抽屉式导航不用多说,很多应用中都有这种操作方式。

(1) API定义

createDrawerNavigator(RouteConfigs, DrawerNavigatorConfig);

(2)RouteConfigs(路由配置对象)
依旧参照createStackNavigator属性配置。

(3) DrawerNavigatorConfig(导航配置对象)

  • drawerWidth - 抽屉或返回抽屉的函数的宽度。
  • drawerPosition - 选项有leftright。默认是left位置。
  • contentComponent - 用于呈现抽屉内容的组件,例如,导航项。为抽屉接收navigation属性的。默认为DrawerItems。有关更多信息,请参见下文。
  • contentOptions - 配置抽屉内容,见下文。
  • useNativeAnimations - 启用本机动画。默认为true
  • drawerBackgroundColor - 使用抽屉背景来选择一些颜色。默认值为white
  • navigationOptions - 导航器本身的导航选项,用于配置父导航器。
  • defaultNavigationOptions - 用于屏幕的默认导航选项。

DrawerNavigator在引擎下使用DrawerLayout,因此它继承了以下特性:

  • drawerType - frontbackslide其中一个。
  • edgeWidth - 允许定义离内容视图边缘有多远时滑动手势应该激活。
  • hideStatusBar - 设置为true时,当抽屉被拉出或者处于打开状态下,Drawer组件会隐藏系统状态栏。
  • overlayColor - 当抽屉打开时,要在内容视图的上层展示的遮罩层颜色。应该使用实心的颜色,因为不透明度是由Drawer本身添加的,并且遮罩的不透明度是动态的(从0%到70%)。

有几个选项传递给底层路由器以修改导航逻辑:

  • initialRouteName - 初始路由的路由名称。
  • order - 定义抽屉项顺序的路由名称数组。
  • paths - 提供RouteName到路径配置的映射,该映射会覆盖RouteConfigs中设置的路径值。
  • backBehavior - 后退按钮是否应导致切换到初始路线?如果是,则设置为initialRoute,否则为none。默认为initialRoute行为。

contentComponent还可以接收一个名为drawerOpenProgress的属性,它是表示抽屉动画位置的动画值(0为关闭,1为打开)。该属性允许你在contentComponent执行有趣的动画,像抽屉的视差运动。

(4) DrawerItems的内容选项:

  • items - 路由数组,可以修改或重写。
  • activeItemKey - 识别活动路线的Key值。
  • activeTintColor - 活动标签的标签和图标颜色。
  • activeBackgroundColor - 活动标签的背景色。
  • inactiveTintColor - 非活动标签的标签和图标颜色。
  • inactiveBackgroundColor - 非活动标签的背景色。
  • onItemPress(route) - 当按下某个item时要调用的函数。
  • itemsContainerStyle - 内容容器的样式对象。
  • itemStyle - 单个项的样式对象,可以包含图标和(或)标签。
  • labelStyle - 当标签是字符串时,样式对象覆盖内容容器内的Text样式。
  • activeLabelStyle - Style对象在标签是字符串(与labelStyle合并)时覆盖活动标签的Text样式。
  • inactiveLabelStyle - Style对象在标签是字符串(与LabelStyle合并)时覆盖非活动标签的文本样式。
  • iconContainerStyle - 样式对象覆盖View图标容器样式。

(5) navigationOptions - 用于导航内部的页面配置

  • title - 可用作headerTitledrawerLabel回退的通用标题。
  • drawerLabel - 字符串、react元素或给定{ focused: boolean, tintColor: string }返回一个react.node的函数,显示在抽屉边栏中。未定义时,使用场景标题。
  • drawerIcon - react元素或函数,如果给定{ focused: boolean, tintColor: string }返回react.node,显示在抽屉边栏中。
  • drawerLockMode - 指定抽屉的锁定模式。也可以通过在顶级路由器上使用screenProps.drawerLockMode动态更新。

将抽屉导航器嵌套在其他内部

如果抽屉导航器嵌套在另一个提供某些UI的导航器中,例如选项卡导航器或堆栈导航器,则抽屉将呈现在这些导航器UI的下方。抽屉将出现在标签栏下方和堆栈标题下方。嵌套时需要使抽屉导航器成为任何导航器的父级,其中抽屉应在其UI顶部呈现。

三、结束

React-Navigation中的几种导航类型就都介绍完了,这里主要是罗列了各个导航器的属性配置(如果开发中遇到导航相关的BUG可以查找这些属性来调整解决,大部分是可以解决掉的)。由于篇幅问题,这篇文章只介绍属性,后面两篇会介绍每种导航器的用法及相互嵌套时的使用方式。另外,这几个导航的中文名称是我自己根据功能加上去的,大家可以不用在意。

  下一篇:ReactNative系列(五):react-natigation 3.x全解(中)

 有问题的地方欢迎指出,大家一起讨论,喜欢的话可以点赞关注。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容