npm install --save react-navigation

1.测试TabNavigator、StackNavigator和DrawerNavigator

(1)新建HomeScreen.js

/**
* 主页面
*/
import React, { Component } from 'react';
import {
StyleSheet,
View,
Text,
Button,
Image,
} from 'react-native'; // 引入 导航组件
import {
StackNavigator,
TabNavigator,
TabBarBottom,
} from 'react-navigation'; // TabBar 子组件
import TabBarItem from './TabBarItem'; // 引入 其他组件
import MainScreen from './MainPage';
import MineScreen from './MinePage';
import ChatScreen from './ChatScreen'; export default class HomeScreen extends Component {
// 渲染页面
render() {
return (
<Navigator />
)
}
} /**
* TabNavigator Tab选项卡
* TabNavigator(RouteConfigs, TabNavigatorConfig)
* 参数1:表示各个页面路由配置
* 参数2:tab属性配置
*/
// 注册tabs (底部选项卡)
const Tab = TabNavigator(
{
Main:{
screen:MainScreen, // 对应界面名称,可以在其他页面通过这个screen传值和跳转。
navigationOptions:({navigation}) => ({ // 配置TabNavigator的一些属性
tabBarLabel:'首页', // 设置标签栏的title
tabBarIcon:({focused,tintColor}) => ( // 设置标签栏的图标。需要给每个都设置
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./image/home.png')}
selectedImage={require('./image/home.png')}
/>
)
}),
}, Mine:{
screen:MineScreen,
navigationOptions:({navigation}) => ({
tabBarLabel:'我的',
tabBarIcon:({focused,tintColor}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./image/mine.png')}
selectedImage={require('./image/mine.png')}
/>
)
}),
},
},
{
tabBarComponent:TabBarBottom, // 导航器 组件
tabBarPosition:'bottom', // 显示在底端,android 默认是显示在页面顶端的
swipeEnabled:false, // 禁止左右滑动
animationEnabled:false, // 切换页面时不显示动画
lazy:true, // 懒加载
tabBarOptions:{
activeTintColor:'#06c1ae', // 文字和图片选中颜色
inactiveTintColor:'#979797', // 文字和图片默认颜色
indicatorStyle: {height: 0}, // android 中TabBar下面会显示一条线,高度设为 0 后就不显示线了
style:{
backgroundColor:'#ffffff', // TabBar 背景色
},
labelStyle: {
fontSize: 12, // 文字大小
},
}
}
); /**
* 注册导航
*/
const Navigator = StackNavigator(
{
Tab:{screen:Tab},
Chat:{screen:ChatScreen},
},
{
initialRouteName:'Tab', // 默认显示页面
navigationOptions:{
// header:null, // 可以设置一些导航的属性,如果隐藏顶部导航栏只要将这个属性设置为null
headerBackTitle: null, // 设置跳转页面左侧返回箭头后面的文字,默认是上一个页面的标题。
headerTitleStyle: {fontSize:18, color:'#666666',alignSelf:'center'}, // 设置alignSelf:'center' 文字居中
headerStyle: {height:48, backgroundColor:'#00BFFF'},
},
mode:'card', // 使用iOS和安卓默认的风格
}
);

(2)新建MainPage.js

/**
* 首页
*/
import React, { Component } from 'react';
import {
Button,
Image,
View,
Text,
StyleSheet,
} from 'react-native'; export default class MainPage extends Component {
static navigationOptions = {
title:'首页', // 顶部标题 }; render() {
const {navigate} = this.props.navigation;
return(
<View style={styles.container}>
<Text onPress={() =>{
navigate('Chat',{user:'Sybil'})
}}>点击跳转到'聊天页面'</Text>
</View>
);
} _skip() {
/**
* 页面跳转并传值
* 参数1:页面名称
* 参数2:传的值
* <Text onPress={this._skip.bind(this)}>点击跳转到'我的页面'</Text>
*/
// this.props.navigation.navigate('Chat',{user:'Sybil'});
}
} // 层叠样式表
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});

(3)新建MinePage.js

/**
* 我的
*/
import React, {Component} from 'react';
import {
Button,
Image,
View,
Text,
StyleSheet,
} from 'react-native'; import {
DrawerNavigator
} from 'react-navigation'; // 引入 侧滑菜单组件 (通知页)
import MyNotificationsScreen from './MyNotificationsScreen'; // 定义 我的组件
class MinePage extends Component{
// 定义抽屉子组件样式
static navigationOptions = {
title:'我的',
drawerLabel: '我的',
drawerIcon: ({ tintColor }) => (
<Image
source={require('./image/chat.png')}
style={[styles.tabIcon, {tintColor: tintColor}]}
/>
),
}; // 组件加载完成
componentDidMount() {
// 获取传值 {this.props.navigation.state.params.info}
// const {params} = this.props.navigation.state;
// const user = params.user;
// alert(user);
} render(){;
return(
<View style={styles.container}>
<Text style={{padding:20}}>Sybil</Text>
<Button
style={{padding:20}}
onPress={() => this.props.navigation.navigate('DrawerOpen')}
title="点击打开侧滑菜单"
/>
</View>
);
}
} const styles = StyleSheet.create({
container:{
flex:1,
backgroundColor:'#fff',
},
tabIcon: {
width: 16,
height: 16,
},
}); /**
* 注册抽屉 (侧滑菜单)
* DrawerNavigator(RouteConfigs, DrawerNavigatorConfig)
* 参数1:抽屉包含的子组件
* 参数2:抽屉的样式
*/
const MyDrawerNavigator = DrawerNavigator(
{
Mine: {
screen: MinePage,
},
Notifications: {
screen: MyNotificationsScreen,
},
},
{
drawerWidth: 200, // 抽屉宽
drawerPosition: 'left', // 抽屉在左边还是右边
// contentComponent: CustomDrawerContentComponent, // 自定义抽屉组件
contentOptions: {
initialRouteName: MinePage, // 默认页面组件
activeTintColor: '#008AC9', // 选中文字颜色
activeBackgroundColor: '#f5f5f5', // 选中背景颜色
inactiveTintColor: '#000', // 未选中文字颜色
inactiveBackgroundColor: '#fff', // 未选中背景颜色
style: { // 样式 }
}
}
); // 默认向外暴露 '我的抽屉' 组件
export default MyDrawerNavigator;

(4)编写TabBarItem.js

/**
* 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 : this.props.normalImage}
style={{tintColor:this.props.tintColor,width:25,height:25 }}
/>
)
}
}

(5)编写ChatScreen.js

/**
* 聊天页
*/
import React, { Component } from 'react';
import {
Button,
Image,
View,
Text
} from 'react-native'; export default class ChatScreen extends Component {
static navigationOptions = {
title:'聊天',
}; render() {
const {params} = this.props.navigation.state;
return (
<View style={{backgroundColor:'#fff',flex:1}}>
<Text style={{padding:20}}>Chat with {params.user}</Text> </View> );
}
}

(6)编写MyNotificationsScreen.js

/**
* 侧滑菜单
* 通知页
*/
import React, { Component } from 'react';
import {
StyleSheet,
View,
Text,
Button,
Image
} from 'react-native'; // 定义 通知组件
export default class MyNotificationsScreen extends Component {
// 定义抽屉子组件样式
static navigationOptions = {
title:'通知',
drawerLabel: '通知',
drawerIcon: ({ tintColor }) => (
<Image
source={require('./image/notif.png')}
style={[styles.tabIcon, {tintColor: tintColor}]}
/>
),
}; render() {
return (
<View style={styles.container}>
<Button
style={{padding:20}}
onPress={() => this.props.navigation.navigate('DrawerOpen')}
title="点击打开侧滑菜单"
/>
<Button
onPress={() => this.props.navigation.goBack()}
title="返回我的界面"
/>
</View>
);
}
} const styles = StyleSheet.create({
container: {
backgroundColor:'#fff',
},
tabIcon: {
width: 16,
height: 16,
},
});

效果图

react-navigation 实战的更多相关文章

  1. RN 实战 & React Native 实战

    RN 实战 & React Native 实战 https://abc.xgqfrms.xyz/react-native-docs/ 0.59 https://github.com/xgqfr ...

  2. react-native 学习 ----- React Navigation

    很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...

  3. react-native导航器 react navigation 介绍

    开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...

  4. React Navigation & React Native & React Native Navigation

    React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...

  5. [RN] 04 - React Navigation

    react-navigation和react-router的对比: 支持的平台: react-navigation: react-native react-router: react-native.r ...

  6. React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方

    以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation  react-native ...

  7. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  8. React-native 导航插件React Navigation 4.x的使用

    React-native 导航插件React Navigation 4.x的使用 文档 英文水平可以的话,建议直接阅读英文文档 简单使用介绍 安装插件 yarn add react-navigatio ...

  9. [RN] React Navigation 使用中遇到的显示 问题 汇总

    React Navigation 使用中遇到的显示 问题 汇总 https://www.jianshu.com/p/8b1f18affc5d

  10. react navigation goBack()返回到任意页面(不集成redux) 一

    方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...

随机推荐

  1. “希希敬敬对”队软件工程第九次作业-beta冲刺第二次随笔

    队名:  “希希敬敬对” 龙江腾(队长) 201810775001 杨希                   201810812008 何敬上 201810812004 今日讨论会议照片一张: 每个人 ...

  2. leveldb memtable

    memtable常驻于内存,需要按照key进行排序,通常意义上的话,可以使用二叉查找树来实现,跟进一步可以使用红黑树保证树的平衡,但是leveldb中使用了另外的一种数据结构:跳表Skip List. ...

  3. hdu-4292.food(类dining网络流建图)

    Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 《剑指offer》面试题14 调整数组顺序使奇数位于偶数前面 Java版

    (输入整数数组,使所有奇数位于前半部分,所有偶数位于后半部分.) 我的方法:想到用两个下标分别表示奇数和偶数的界线,一个在开头,一个在末尾,判断每一个数字的类别,然后将它放入对应的范围内,移动下标,直 ...

  5. linux驱动模型——platform(2)

    一. platform 组织架构 1.1. platform工作体系都定义在drivers/base/platform.c中 1.2. platform相关函数声明在include/linux/pla ...

  6. C++对象构造时,构造函数运行时并不知道VT的存在

    class A {public: A() { init(); } virtual void init() { printf("A::init\n"); }}; class B : ...

  7. Windows10测试低版本IE方法

    前端开发工程师可能了解IETester是一款IE多版本兼容性测试软件,但是只支持Windows Xp,Vista,7,8系统,Windows10是不支持的,网上所说的开启.net framework ...

  8. idea 创建java web项目ssm-gradle

    环境准备:jdk1.8+tomcat8+idea+gradle 1.创建项目SSM 使用gradle创建项目,按照提示如下   image.png 输入项目名称,组名   image.png   im ...

  9. Azkaban和Oozie的区别

    Azkaban和Oozie的区别: 当前,实际生产中最流行的两种Hadoop工作流引擎是Azkaban与Oozie.但活跃度最高的当是Azkaban了,下面对两者的异同之处作如下对比. 功能对比 Az ...

  10. Apache Mesos1.0.1 编译安装部署教程(ubuntu)

    参考资料 官方文档:http://mesos.apache.org/documentation 中文翻译:http://mesos.mydoc.io/ GitHub:https://github.co ...