react-navigation 实战
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 实战的更多相关文章
- RN 实战 & React Native 实战
RN 实战 & React Native 实战 https://abc.xgqfrms.xyz/react-native-docs/ 0.59 https://github.com/xgqfr ...
- react-native 学习 ----- React Navigation
很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...
- react-native导航器 react navigation 介绍
开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...
- React Navigation & React Native & React Native Navigation
React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...
- [RN] 04 - React Navigation
react-navigation和react-router的对比: 支持的平台: react-navigation: react-native react-router: react-native.r ...
- React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方
以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation react-native ...
- React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发 2016/09/23 | React Native技术文章 | Sky丶清| 4 条评论 | 1 ...
- React-native 导航插件React Navigation 4.x的使用
React-native 导航插件React Navigation 4.x的使用 文档 英文水平可以的话,建议直接阅读英文文档 简单使用介绍 安装插件 yarn add react-navigatio ...
- [RN] React Navigation 使用中遇到的显示 问题 汇总
React Navigation 使用中遇到的显示 问题 汇总 https://www.jianshu.com/p/8b1f18affc5d
- react navigation goBack()返回到任意页面(不集成redux) 一
方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...
随机推荐
- js字符串、数组处理方法、以及一些常用js方法
1.截取获得某字符串后面的字符: var i = id.substring(id.indexOf("+") + 1, id.length);//获取+后面的字符 2.截取量字符串之 ...
- xmake v2.1.9版本发布,增加可视化图形菜单配置
此版本主要增加xmake f --menu实现用户自定义图形菜单配置,界面风格类似linux的make menuconfig: [图片上传失败-(image-505bc0-1517795319124) ...
- web 前端2 CSS
CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式 ...
- centos7下搭建Testlink环境详细过程
花了半天的时间终于搭建好了完整的Testlink环境,主要包括Mysql以及PHP的版本.未关闭防火墙.以及安装配置过程中遇到的一些问题.以下是详细的搭建过程. 一.工具准备 以下是我在搭建过程中用到 ...
- Java学习day11-类的成员之三:构造器(构造方法)
一.构造器(构造方法) 语法格式: 修饰符 类名(参数列表){ 初始化语句: } 构造器的特征: 1.它具有与类相同的名称 2.它不声明返回值类型.(与声明为void不同) 3.不能被static.f ...
- 使用 js 修饰器封装 axios
修饰器 修饰器是一个 JavaScript 函数(建议是纯函数),它用于修改类属性/方法或类本身.修饰器提案正处于第二阶段,我们可以使用 babel-plugin-transform-decorato ...
- k8s结合helm部署
一.安装Helm helm教程以及安装可以参考这篇文章 二.Heml说明 常见的helm模板如下 myapp - chart 包目录名 ├── charts - 依赖的子包目录,里面可以包含多个依赖的 ...
- CentOS7搭建Docker镜像实战
开发十年,就只剩下这套架构体系了! >>> 一.搭建环境 使用的是VMWare 12虚拟机安装的CentOS7 安装成功后修改ip: 1. ip addr查看相关信息: 2. 修 ...
- asp.net webapi自定义输出结果类似Response.Write()
asp.net webapi自定义输出结果类似Response.Write() [HttpGet] public HttpResponseMessage HelloWorld() { string ...
- 行人重识别(ReID) ——技术实现及应用场景
导读 跨镜追踪(Person Re-Identification,简称 ReID)技术是现在计算机视觉研究的热门方向,主要解决跨摄像头跨场景下行人的识别与检索.该技术能够根据行人的穿着.体态.发型等信 ...