视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
react-navigation使用步骤详解
2020-11-27 19:47:53 责编:小采
文档
 这次给大家带来react-navigation使用步骤详解,react-navigation使用的注意事项有哪些,下面就是实战案例,一起来看一下。

一、主要构成

按使用形式主要分三部分:

  1. StackNavigator: 类似于普通的Navigator,屏幕上方导航栏

  2. TabNavigator: 相当于ios里面的TabBarController,屏幕下方的标签栏

  3. DrawerNavigator: 抽屉效果,侧边滑出

二、使用

1.新建项目

react-native init ComponentDemo

2. 在应用中安装此库

npm install --save react-navigation

安装完发现是beta版本(v1.0.0-beta.7) ,竟然有坑?!一会儿我们会详细说这个坑~

3.测试TabNavigator、StackNavigator和DrawerNavigator

(1)新建HomePage.js

import React from 'react';
import {
 StyleSheet,
 View,
 Text,
 Button,
 Image
} from 'react-native';
import {
 StackNavigator,
 TabNavigator
} from 'react-navigation';
import ChatScreen from './ChatScreen';
import MinePage from './MinePage';
class HomePage extends React.Component{
 static navigationOptions={
 title: '首页',//设置标题内容
 header:{
 backTitle: ' ',//返回按钮标题内容(默认为上一级标题内容)
 }
 }
 constructor(props) {
 super(props);
 }
 render() {
 const {navigate} = this.props.navigation;
 return (
 <View style={styles.container}>
 <Text style={{padding:10}}>Hello, Navigation!</Text>
 <Button
 onPress={() => navigate('Chat',{user:'Sybil'})}
 title="点击跳转"/>
 </View>
 )
 }
}
const MainScreenNavigator = TabNavigator({
 Home: {
 screen: HomePage,
 navigationOptions: {
 tabBar: {
 label: '首页',
 icon: ({tintColor}) => (
 <Image
 source={require('./image/bar_home_nomarl@3x.png')}
 style={[{tintColor: tintColor},styles.icon]}
 />
 ),
 },
 }
 },
 Certificate: {
 screen: MinePage,
 navigationOptions: {
 tabBar: {
 label: '我的',
 icon: ({tintColor}) => (
 <Image
 source={require('./image/bar_center_normal@3x.png')}
 style={[{tintColor: tintColor},styles.icon]}
 />
 ),
 },
 }
 },
}, {
 animationEnabled: false, // 切换页面时不显示动画
 tabBarPosition: 'bottom', // 显示在底端,android 默认是显示在页面顶端的
 swipeEnabled: false, // 禁止左右滑动
 backBehavior: 'none', // 按 back 键是否跳转到第一个 Tab, none 为不跳转
 tabBarOptions: {
 activeTintColor: '#008AC9', // 文字和图片选中颜色
 inactiveTintColor: '#999', // 文字和图片默认颜色
 showIcon: true, // android 默认不显示 icon, 需要设置为 true 才会显示
 indicatorStyle: {height: 0}, // android 中TabBar下面会显示一条线,高度设为 0 后就不显示线了
 style: {
 backgroundColor: '#fff', // TabBar 背景色
 },
 labelStyle: {
 fontSize: 12, // 文字大小
 },
 },
});
const styles = StyleSheet.create({
 container:{
 flex: 1,
 backgroundColor:'#fff'
 },
 icon: {
 height: 22,
 width: 22,
 resizeMode: 'contain'
 }
});
const SimpleApp = StackNavigator({
 Home: {screen: MainScreenNavigator},
 Chat:{screen:ChatScreen},
});
export default SimpleApp;

(2)新建ChatScreen.js

import React from 'react';
import {
 Button,
 Image,
 View,
 Text
} from 'react-native';
class ChatScreen extends React.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>
 );
 }
}
export default ChatScreen;

(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: '我的',
 // Note: By default the icon is only shown on iOS. Search the showIcon option below.
 drawerIcon: ({ tintColor }) => (
 <Image
 source={require('./image/chat@3x.png')}
 style={[styles.icon, {tintColor: tintColor}]}
 />
 ),
 };
 render(){;
 return(
 <View style={{backgroundColor:'#fff',flex:1}}>
 <Text style={{padding:20}}>Sybil</Text>
 <Button
 style={{padding:20}}
 onPress={() => this.props.navigation.navigate('DrawerOpen')}
 title="点击打开侧滑菜单"
 />
 </View>
 );
 }
}
const styles = StyleSheet.create({
 icon: {
 width: 24,
 height: 24,
 },
});
const MyChatNavigator = DrawerNavigator({
 MyChat: {
 screen: MinePage,
 },
 Notifications: {
 screen: MyNotificationsScreen,
 },
},{
 drawerWidth: 220, // 抽屉宽
 drawerPosition: 'left', // 抽屉在左边还是右边
 // contentComponent: CustomDrawerContentComponent, // 自定义抽屉组件
 contentOptions: {
 initialRouteName: MinePage, // 默认页面组件
 activeTintColor: '#008AC9', // 选中文字颜色
 activeBackgroundColor: '#f5f5f5', // 选中背景颜色
 inactiveTintColor: '#000', // 未选中文字颜色
 inactiveBackgroundColor: '#fff', // 未选中背景颜色
 style: { // 样式
 }
 }
});
export default MyChatNavigator;

(4)编写MyNotificationsScreen.js

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

(5)运行

报错啦?这就是上面我们所说的坑~

什么原因呢?原来是测试版的bug,在目录中找到node_modules/react-navigation/src/views/Header.js的第12行,删除它就OK了~

Ps:遗憾的是这个错误我没有留图啊~在我即将发表这篇文章的时候,最新版已经变为(v1.0.0-beta.9)了,最新版已经将上述的bug修改了!

好了,再次运行~

上一个动态效果图:

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

Vue多级组件provide/inject使用详解

vue父子组件传值及slot应用步骤详解

下载本文
显示全文
专题