react-navigation使⽤详解(转载)
上篇博客和⼤家分享了关于React Native jsBundle预加载,界⾯启动优化的内容,详情可点击:
⼀、开源库介绍
今年1⽉份,新开源的react-natvigation库备受瞩⽬。在短短不到3个⽉的时间,github上星数已达4000+。Fb推荐使⽤库,并且在React Native当前最新版本0.44中将Navigator删除。react-navigation据称有原⽣般的性能体验效果。可能会成为未来React Native导航组件的主流军。本篇内容基于【 ^1.0.0-beta.9 】版本来介绍关于该库的使⽤和实战技巧。可以看到,虽然是beta版本,不过基本稳定,⼤家可放⼼在项⽬中使⽤。奉上
该库包含三类组件:
(1)StackNavigator:⽤来跳转页⾯和传递参数
(2)TabNavigator:类似底部导航栏,⽤来在同⼀屏幕下切换不同界⾯
(3)DrawerNavigator:侧滑菜单导航栏,⽤于轻松设置带抽屉导航的屏幕
⼆、react-navigation使⽤
具体内容⼤致分为如下:
(1)react-navigation库属性介绍
(2)StackNavigator、TabNavigator实现界⾯间跳转,Tab切换
(3)StackNavigator界⾯间跳转、传值、取值
(4)DrawerNavigator实现抽屉导航菜单
(5)DrawerNavigator扩展功能
(6)⾃定义react-navigation
1、StackNavigator属性介绍
navigationOptions:配置StackNavigator的⼀些属性。
title:标题,如果设置了这个导航栏和标签栏的title就会变成⼀样的,不推荐使⽤
header:可以设置⼀些导航的属性,如果隐藏顶部导航栏只要将这个属性设置为null
headerTitle:设置导航栏标题,推荐
headerBackTitle:设置跳转页⾯左侧返回箭头后⾯的⽂字,默认是上⼀个页⾯的标题。可以⾃定义,也可以设置为null
headerTruncatedBackTitle:设置当上个页⾯标题不符合返回箭头后的⽂字时,默认改成"返回"
headerRight:设置导航条右侧。可以是按钮或者其他视图控件
headerLeft:设置导航条左侧。可以是按钮或者其他视图控件
headerStyle:设置导航条的样式。背景⾊,宽⾼等
headerTitleStyle:设置导航栏⽂字样式
headerBackTitleStyle:设置导航栏‘返回’⽂字样式
headerTintColor:设置导航栏颜⾊
headerPressColorAndroid:安卓独有的设置颜⾊纹理,需要安卓版本⼤于5.0
gesturesEnabled:是否⽀持滑动返回⼿势,iOS默认⽀持,安卓默认关闭
screen:对应界⾯名称,需要填⼊import之后的页⾯
mode:定义跳转风格
card:使⽤iOS和安卓默认的风格
modal:iOS独有的使屏幕从底部画出。类似iOS的present效果
headerMode:返回上级页⾯时动画效果
float:iOS默认的效果
screen:滑动过程中,整个页⾯都会返回
none:⽆动画
cardStyle:⾃定义设置跳转效果
transitionConfig:⾃定义设置滑动返回的配置
onTransitionStart:当转换动画即将开始时被调⽤的功能
onTransitionEnd:当转换动画完成,将被调⽤的功能
path:路由中设置的路径的覆盖映射配置
initialRouteName:设置默认的页⾯组件,必须是上⾯已注册的页⾯组件
initialRouteParams:初始路由参数
注:⼤家可能对于path不太理解。path属性适⽤于其他app或浏览器使⽤url打开本app并进⼊指定页⾯。path属性⽤于声明⼀个界⾯路径,例如:【/pages/Home】。此时我们可以在⼿机浏览器中输⼊:app名称://pages/Home来启动该App,并进⼊Home界⾯。
2、TabNavigator属性介绍
screen:和导航的功能是⼀样的,对应界⾯名称,可以在其他页⾯通过这个screen传值和跳转。
navigationOptions:配置TabNavigator的⼀些属性
title:标题,会同时设置导航条和标签栏的title
tabBarVisible:是否隐藏标签栏。默认不隐藏(true)
tabBarIcon:设置标签栏的图标。需要给每个都设置
tabBarLabel:设置标签栏的title。推荐
导航栏配置
tabBarPosition:设置tabbar的位置,iOS默认在底部,安卓默认在顶部。(属性值:'top','bottom')
swipeEnabled:是否允许在标签之间进⾏滑动
animationEnabled:是否在更改标签时显⽰动画
lazy:是否根据需要懒惰呈现标签,⽽不是提前,意思是在app打开的时候将底部标签栏全部加载,默认false,推荐为true
trueinitialRouteName:设置默认的页⾯组件
backBehavior:按 back 键是否跳转到第⼀个Tab(⾸页), none 为不跳转
tabBarOptions:配置标签栏的⼀些属性iOS属性
activeTintColor:label和icon的前景⾊活跃状态下
activeBackgroundColor:label和icon的背景⾊活跃状态下
inactiveTintColor:label和icon的前景⾊不活跃状态下
inactiveBackgroundColor:label和icon的背景⾊不活跃状态下
showLabel:是否显⽰label,默认开启 style:tabbar的样式
labelStyle:label的样式安卓属性
activeTintColor:label和icon的前景⾊活跃状态下
inactiveTintColor:label和icon的前景⾊不活跃状态下
showIcon:是否显⽰图标,默认关闭
showLabel:是否显⽰label,默认开启 style:tabbar的样式
labelStyle:label的样式 upperCaseLabel:是否使标签⼤写,默认为true
pressColor:material涟漪效果的颜⾊(安卓版本需要⼤于5.0)
pressOpacity:按压标签的透明度变化(安卓版本需要⼩于5.0)
scrollEnabled:是否启⽤可滚动选项卡 tabStyle:tab的样式
indicatorStyle:标签指⽰器的样式对象(选项卡底部的⾏)。安卓底部会多出⼀条线,可以将height设置为0来暂时解决这个问题
labelStyle:label的样式
iconStyle:图标样式
3、DrawerNavigator属性介绍
DrawerNavigatorConfig
drawerWidth - 抽屉的宽度
drawerPosition - 选项是左或右。默认为左侧位置
contentComponent - ⽤于呈现抽屉内容的组件,例如导航项。接收抽屉的导航。默认为DrawerItems
contentOptions - 配置抽屉内容
initialRouteName - 初始路由的routeName
order - 定义抽屉项⽬顺序的routeNames数组。
路径 - 提供routeName到路径配置的映射,它覆盖routeConfigs中设置的路径。
backBehavior - 后退按钮是否会切换到初始路由?如果是,设置为initialRoute,否则为none。默认为initialRoute⾏为
DrawerItems的contentOptions属性
activeTintColor - 活动标签的标签和图标颜⾊
activeBackgroundColor - 活动标签的背景颜⾊
inactiveTintColor - ⾮活动标签的标签和图标颜⾊
inactiveBackgroundColor - ⾮活动标签的背景颜⾊
内容部分的样式样式对象
labelStyle - 当您的标签是字符串时,要覆盖内容部分中的⽂本样式的样式对象
从上述中⼤致了解了react-navigation三种组件的⼀些基本属性,所以到我们甩起袖⼦撸代码见证下奇迹了。
4、使⽤StackNavigator + TabNavigator实现Tab界⾯切换、界⾯间导航
API定义:StackNavigator(RouteConfigs, StackNavigatorConfig)、TabNavigator(RouteConfigs, TabNavigatorConfig)(1)集成 react-navigation:在终端执⾏【 npm install react-navigation --save 】
(2)界⾯中导⼊必要组件:
import {StackNavigator,TabNavigator,TabBarBottom} from'react-navigation';
import HomeScreen from'./pages/HomePage';
import MineScreen from'./pages/MinePage';
(3)定义TabNavigator:
const Tab = TabNavigator(
{
Home:{
screen:HomeScreen,
navigationOptions:({navigation}) => ({
tabBarLabel:'⾸页',
tabBarIcon:({focused,tintColor}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./imgs/nav_fav@2x.png')}
selectedImage={require('./imgs/nav_fav_actived@3x.png')}
/
>
)
}),
},
Mine:{
screen:MineScreen,
navigationOptions:({navigation}) => ({
tabBarLabel:'我',
tabBarIcon:({focused,tintColor}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./imgs/tab_me_nor@3x.png')}
selectedImage={require('./imgs/tab_me_selected@2x.png')}
/>
)
}),
},
},
{
tabBarComponent:TabBarBottom,
tabBarPosition:'bottom',
swipeEnabled:false,
animationEnabled:false,
lazy:true,
tabBarOptions:{
activeTintColor:'#06c1ae',
inactiveTintColor:'#979797',
style:{backgroundColor:'#ffffff',},
labelStyle: {
fontSize: 20, // ⽂字⼤⼩
},
}
}
);
TabBarItem为封装的组件:
import React,{Component} from'react';
import {Image} from'react-native';
export default class TabBarItem extends Component {
render() {
return(
<Image source={ this.props.focused ? this.props.selectedImage : alImage }
style={ { tintColor:this.props.tintColor,width:25,height:25 } }
/>
)
}
}
可以看到,我们定义了⼀个名称为【Tab】的TabNavigator的导航组件。在组件中,分为两层参数:
(1)第⼀层参数定义了要切换的界⾯,即【⾸页】、【我】两个界⾯组件,通过screen属性指定。并且通过navigationOptions属性设置相关属性参数。
(2)设置导航栏的属性参数。
TabNavigator定义好之后,需要⽤StackNavigator,顾名思义,StackNavigator就是以栈的⽅式来存放整个界⾯的,⽽TabNavigator是作为⼀个界⾯内不同⼦界⾯之间切换。所以还需要我们定义StackNavigator:
const Navigator = StackNavigator(
{
Tab:{screen:Tab},
Product:{screen:ProductScreen}
},
{
navigationOptions:{
headerBackTitle:null,
headerTintColor:'#333333',
showIcon:true,
swipeEnabled:false,
animationEnabled:false,
},
mode:'card',
});
看起来和TabNavigator很相似,同样是指定了两个参数:
(1)指定要跳转的界⾯组件。同样是screen属性标识界⾯组件,不多赘述。
(2)定义跳转属性参数,即顶部导航栏的⼀些参数设置和跳转⽅式。react native
可以看到,我们将Tab作为⼀个界⾯设置到了StackNavigator。这样就可以实现Tab导航和界⾯间跳转的效果了。
最后就是在render中引⽤StackNavigator:
export default class Demo extends Component {
render() {
return (
<Navigator />
);
}
}
tackNavigator还提供了onNavigationStateChange回调⽅法,⽤来监听导航状态的改变。具体不再赘述。实现了界⾯跳转和切换,那么就该来增加下界⾯之间的感情了,来看看如何实现界⾯之间的传值和取值。
5、界⾯间跳转、传值、取值
在界⾯组件注⼊到StackNavigator中时,界⾯组件就被赋予了navigation属性,即在界⾯组件中可以通过【this.props.navigation】获取并进⾏⼀些操作。
navigation属性中提供了很多的函数简化界⾯间操作,简单列举⼏点:
(1)通过navigate函数实现界⾯之间跳转:
this.props.navigation.navigate('Mine');
参数为我们在StackNavigator注册界⾯组件时的名称。同样也可以从当前页⾯返回到上⼀页:
/
/ 返回上⼀页
this.Back();
(2)跳转时传值:
this.props.navigation.navigate('Mine',{info:'传值过去'});
第⼀个参数同样为要跳转的界⾯组件名称,第⼆个参数为要传递的参数,info可以理解为key,后⾯即传递的参数。
(3)获取值:
{this.props.navigation.state.params.info}
通过state.params来获取传来的参数,后⾯为key值。此处为info。
以上实现完成,我们就可以愉快的玩耍啦~~ 什么?忽然发现在Android上的效果和IOS效果不⼀样。⽼板要界⾯⼀致哇~ 怎么办?那就需要我们进⾏简单的适配了。
三、DrawerNavigator实现抽屉导航
1、导航实现
API定义:DrawerNavigator(RouteConfigs,DrawerNavigatorConfig)
(1)界⾯中定义DrawerNavigator:
import {StackNavigator,TabNavigator,DrawerNavigator} from'react-navigation';
import HomeScreen from'./pages/HomePage';
import MineScreen from'./pages/MinePage';
export default class Demo extends Component {
render() {
return (
<Navigator />
);
}
}
const Navigator = DrawerNavigator({
Home:{screen:HomeScreen},
Mine:{screen:MineScreen},
});
const styles = ate({
container: {
flex: 1,
},
});
定义⽅式和StackNavigator基本类似,不再赘述。
(2)HomeScreen界⾯和MineScreen界⾯:
export default class HomePage extends Component {
static navigationOptions = {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论