react-Navigation|react-Navigation (3.0以上)简单使用
1.引入第三方库:
yarn add react-navigation
yarn add react-native-gesture-handler
react-native link react-native-gesture-handler
切记切记:3.0以上需要引用react-native-gesture-handler库!!!否则createStackNavigator一定报错(都是血泪史)...还有,navigator导出时一定要包裹createAppContainer....都是坑啊
2.先浏览一下效果吧
导航1.gif 导航2.gif 3.导航1本人是以RootNavigator为跟导航的,流程如下:
//RooterNavigator
import {createAppContainer,createStackNavigator} from 'react-navigation';
import LoginScreen from './LoginScreen';
import MainNavigator from './MainNavigator';
import DetailScreen from './DetailScreen';
const navigator = createStackNavigator({
ligin:{
screen: LoginScreen,},
home:{
screen:MainNavigator,
navigationOptions: ({navigation}) => ({
header: null//设置页面有无标题
})
},
detail:{
screen:DetailScreen,}
});
export default createAppContainer(navigator);
LoginScreen是一个简单的rn页面:
//LoginScreen.js
import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View} from 'react-native';
export default class LoginScreen extends Component{
static navigationOptions={
title:'Login'
}
render() {
return (
{this.props.navigation.navigate('home')}}>去主页
);
}
}const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
});
RootNavigator里面包含着另外一个BottomNavigator,
//MainNavigator
import React, {Component} from 'react';
import {Text, View,Image} from 'react-native';
import {createBottomTabNavigator,createAppContainer,createStackNavigator} from 'react-navigation';
import MainScreen from './MainScreen';
import MeScreen from './MeScreen';
const MainStack = createBottomTabNavigator({
home:{
screen:MainScreen,
navigationOptions:{tabBarIcon:({focused})=>{
if(focused){
return(
)
}else{
return(
)
}
}
}
},
me:{
screen:MeScreen,
navigationOptions:{tabBarIcon:({focused})=>{
if(focused){
return(
)
}else{
return(
)
}
}
}
},},
{
tabBarOptions: {
//当前选中的tab bar的文本颜色和图标颜色
activeTintColor: '#4BC1D2',
//当前未选中的tab bar的文本颜色和图标颜色
inactiveTintColor: '#000',
//是否显示tab bar的图标,默认是false
showIcon: true,
//showLabel - 是否显示tab bar的文本,默认是true
showLabel: true,
//是否将文本转换为大小,默认是true
upperCaseLabel: false,
//material design中的波纹颜色(仅支持Android >= 5.0)
pressColor: '#788493',
//按下tab bar时的不透明度(仅支持iOS和Android < 5.0).
pressOpacity: 0.8,
//tab bar的样式
style: {
backgroundColor: '#fff',
paddingBottom: 1,
borderTopWidth: 0.2,
paddingTop:1,
borderTopColor: '#ccc',
},
//tab bar的文本样式
labelStyle: {
fontSize: 11,
margin: 1
},
//tab 页指示符的样式 (tab页下面的一条线).
indicatorStyle: {height: 0},
},
//tab bar的位置, 可选值: 'top' or 'bottom'
tabBarPosition: 'bottom',
//是否允许滑动切换tab页
swipeEnabled: true,
//是否在切换tab页时使用动画
animationEnabled: false,
//是否懒加载
lazy: true,
//返回按钮是否会导致tab切换到初始tab页? 如果是,则设置为initialRoute,否则为none。 缺省为initialRoute。
backBehavior: 'none',}
);
export default createAppContainer(MainStack);
mainScrren、meScreen、detailScreen与loginScreen类似,就不一一重复。
loginScreen与mainScreen 跳转使用
{this.props.navigation.navigate('home')}}>去主页
mainScreen与detailScreen传值跳转:
//mainScrren.js
{this.props.navigation.navigate('detail',{
name:'marongting',
callBack:(backdata)=>{
Alert.alert(backdata);
}
})}}>to detail
//detailScreen.js
import {get} from 'lodash';
const {state} = this.props.navigation;
let name = get(state,'params.name');
hello,{name}
{this.props.navigation.state.params.callBack('我很好')}}>回调函数
4.抽屉导航是单独拿出来的,已createDrawerNavigator为根导航
//createDrawerNavigator
import React from 'react';
import {
StyleSheet,
View,
Button,
Text,
Image
} from 'react-native';
import {createDrawerNavigator,createAppContainer} from 'react-navigation';
import AppInfoScreen from './AppInfoScreen';
import Setting from './setting';
import DrawMainScreen from './DrawMainScreen';
//this.props.navigation.openDrawer();
//打开抽屉
//this.props.navigation.closeDrawer();
//关闭抽屉
export default createAppContainer(
createDrawerNavigator({
AppInfo: {
screen: AppInfoScreen
},
Main: {
screen: DrawMainScreen
},
Set: {
screen: Setting
},
}, {
order: ['AppInfo', 'Set', 'Main'],//routeNames数组,用于定义抽屉项目的顺序。
initialRouteName: 'Main',//初始路由的routeName。
drawerLockMode: 'unlocked',//设置是否响应手势
//'unlocked'可以通过手势和代码 打开关闭抽屉
//'locked-closed' 抽屉关闭状态不能通过手势打开只能通过代码实现
//'locked-open'抽屉打开状态不能通过手势关闭只能通过代码实现drawerWidth: 250, //抽屉的宽度或返回的功能。
drawerPosition: 'left', //选项是left或right。默认是left位置。
useNativeAnimations: false, //启用原生动画。默认是true。
drawerBackgroundColor: 'white', //使用抽屉背景获取某种颜色。默认是white。//用于呈现抽屉内容的组件,例如导航项。收到navigation抽屉的道具。默认为DrawerItems
//用于自定义
//contentComponent: '',//配置抽屉内容items相关
contentOptions: {
// items: [OtherScreen],//可以修改或覆盖路由数组不知道干嘛用的
// activeItemKey: 'AppInfo', //识别活动路线的关键也不知道干嘛用的activeTintColor: 'white', //活动标签的标签和图标颜色
activeBackgroundColor: 'blue', //活动标签的背景颜色
inactiveTintColor: 'black', //非活动标签的标签和图标颜色
inactiveBackgroundColor: 'red', //非活动标签的背景颜色// //按下项目时要调用的函数 不知道是否使用错误 一直没反应
//github上面有答案 在自定义视图的时候 会有用
// onItemPress(route) {
//console.log('onItemPress'+route);
// },// itemsContainerStyle: '', //内容部分的样式对象
// itemStyle: '', //单个项目的样式对象,可以包含图标和 / 或标签
// labelStyle: '', //Text当标签是字符串时,样式对象在内容部分内覆盖样式
// activeLabelStyle: '', //Text当标签是字符串(与之合并labelStyle)时,样式对象覆盖活动标签的样式
// inactiveLabelStyle: '', //Text当标签是字符串(与之合并labelStyle)时,样式对象覆盖非活动标签的样式
// iconContainerStyle: '', //样式对象以覆盖View图标容器样式。
}})
)
DrawMainScreen如下:
//drawMainScreen.js
import React,{Component} from 'react';
import {
StyleSheet,
View,
Button,
Text,
Image,
TouchableOpacity
} from 'react-native';
export default class DrawMainScreen extends Component{
render(){
return(
{
this.props.navigation.openDrawer();
}}
>
侧栏
首页
)
}
}
AppInfoScreen和Setting与DrawMainScreen类似。
【react-Navigation|react-Navigation (3.0以上)简单使用】好啦,这样简单的导航就实现啦。
完整项目demo见gitHub react-Navigation
推荐阅读
- 情节33.0
- 影响力读后感
- webug3.0渗透基础第九、十关笔记
- react-navigation|react-navigation 动态修改 tabBar 样式
- 感恩日志|感恩日志 第【1237】天((2019.03.03))
- 解放全球宝妈,宝倍爽发布“纸尿裤3.0”开启母婴智能新生活
- Android|Android O 8.0及其以上系统的通知(Notification)、安装apk问题更新后的简单兼容写法
- 使用vue-cli3.0写一个todoList
- 复盘|复盘 2018.03.02 第51天
- vue-cli3.0使用proxytable解决跨域问题