【React Native开发】- React Navigation的使用

1.介绍

react-navigation库包含三个组件:

 - StackNavigator:用来跳转页面和传递参数;

 - TabNavigation:类似底部导航栏,在同一屏幕下,切换不同的页面;

 - DrawerNavigator:侧滑菜单导航栏,设置带抽屉的导航菜单。

2.React-Navigation的使用

2.1 StackNavigator的属性

 - navigationOptions属性:配置stackNavigator的属性

   参数:

           title:标题,设置属性使得导航栏和标题栏的标题一样,不推荐使用;

            visible:导航栏是否显示;

            headerTitle:导航栏的标题,推荐;

            headerBackTitle:左上角返回键的文字,默认上一个页面的title;

            headerTruncatedBackTitle:设置当上一个页面不符合返回箭头文字时,默认‘返回’;

            headerRight:导航栏右侧按钮,可以是按钮或是其他组件;

            headerLeft:导航栏左侧按钮,可以是按钮或是其他组件;

            headerStyle:导航栏的样式;

            headerTitleStyle:导航栏title标题的样式;

            headerBackTitleStyle:导航栏返回文字样式;

            headerTintColor:导航栏颜色;

            headerPressColorAndroid:设置颜色纹理,安卓独有;

            gesturesEnabled:是否允许右滑返回,ios默认true,android默认false;


 - screen:对应界面名称,需要填入import之后的页面;

 - stackNavigatorConfig:

   参数:

           initialRouteName:设置默认的页面组件,必须是上面已经注册的页面;

           initialRouteParams:初始路由的参数;

           navigationOptions:屏幕导航的默认选项;

           paths:RouteConfigs中路径设置的映射;

           mode:页面切换的模式,定义跳转风格;

                 card:普通app常用的左右切换模式,ios和android默认的效果;

                    model:上下切换;

            headerMode: 导航栏的显示模式,返回上一级时的动画效果;

                   float:无透明状态,ios默认的效果;

                     screen:有渐变透明状态;

                     none:隐藏导航栏,无动画;

            cardStyle:自定义设置跳转效果;

            transitionConfig:自定义设置滑动返回的配置;

            onTransitionStart:当转换动画即将开始的时候被调用;

            onTransitionEnd:当转换动画结束的时候被调用;

2.2 TabNavigator的属性


2.3 DrawerNavigator的属性

3.React-Navigation实例

3.1 StackNavigator的实例

3.1.1 属性基本设置

import {AppRegistry} from 'react-native';
import {StackNavigator} from 'react-navigation';
import MainScreen from './StackNavigator/Main/MainScreen'
import MessageScreen from './StackNavigator/Message/MessageScreen'
import MyScreen from './StackNavigator/My/MyScreen'
//StackNavigator
const SNavigator = StackNavigator({
    Main:{
        screen:MainScreen,
        navigationOptions:{
            headerTitle:'首页',
            headerTitleStyle:{color:'#000',fontSize:15},
            headerStyle:{backgroundColor:'#fff'},
            gesturesEnabled:true,//是否允许右滑返回,ios默认true,android默认false;
        },
    },
    Message:{
        screen:MessageScreen,
        navigationOptions:'',//此处设置了, 会覆盖组件内的`static navigationOptions`设置
    },
    My:{screen:MyScreen},
},{
    initialRouteName:'Main',//默认显示的页面
    mode:'card',//页面切换的模式,定义跳转风格,左右card,上下model
    headerMode:'screen',//导航栏的显示模式, screen: 有渐变透明效果, float: 无透明效果, none: 隐藏导航栏
})
AppRegistry.registerComponent('ImageDemo', () => SNavigator);

MainScreen.js代码:
import React,{Component} from 'react'
import {
    StyleSheet,
    View,
    Text,
} from 'react-native'
export default class MainScreen extends Component{
    constructor(props){
        super(props)
    }
    render(){
        return (
            <View style={styles.container}>
                <Text>MainScreen</Text>
            </View>
        )
    }
}
const styles = StyleSheet.create({
    container:{
        flex:1,
    },
})
效果:

3.1.2 页面的跳转页传值

import {AppRegistry} from 'react-native';
import {StackNavigator} from 'react-navigation';
import MainScreen from './StackNavigator/Main/MainScreen'
import MessageScreen from './StackNavigator/Message/MessageScreen'
import MyScreen from './StackNavigator/My/MyScreen'
//StackNavigator
const SNavigator = StackNavigator({
    Main:{
        screen:MainScreen,
        navigationOptions:{},
    },
    Message:{
        screen:MessageScreen,
        navigationOptions:{},//此处设置了, 会覆盖组件内的`static navigationOptions`设置
    },
    My:{screen:MyScreen},
},{
    initialRouteName:'Main',//默认显示的页面
    mode:'card',//页面切换的模式,定义跳转风格,左右card,上下model
    headerMode:'screen',//导航栏的显示模式, screen: 有渐变透明效果, float: 无透明效果, none: 隐藏导航栏
})
AppRegistry.registerComponent('ImageDemo', () => SNavigator);

MainScreen.js代码:
import React,{Component} from 'react'
import {
    StyleSheet,
    View,
    Text,
} from 'react-native'
import Images from '../resource/images'
import TitleBar from '../components/TitleBar'
export default class MainScreen extends Component{
    constructor(props){
        super(props)
    }
    render(){
        return (
            <View style={{flex:1}}>
                <TitleBar
                    title='首页'
                    rightIcon={Images.ic_notification}
                    leftPress={() => {
                        }}
                    rightPress={() => {
                            this._navigateToScreen('Message');
                        }}></TitleBar>
                <View style={styles.container}>
                    <Text>首页</Text>
                </View>
            </View>
        )
    }
    _navigateToScreen(screen){
        const {navigate} = this.props.navigation
        navigate(screen)
    }
}
const styles = StyleSheet.create({
    container:{
        flex:1,
        justifyContent:'center',
        alignItems:'center',
    },
})
images.js图片资源:
const images = {
    ic_back:require('./imgs/back.png'),
    ic_notification:require('./imgs/notifications.png'),
}
export default images

TitleBar.js代码:
import React,{Component,PropTypes} from 'react'
import {
    StyleSheet,
    Text,
} from 'react-native'
import ImageButton from './ImageButton'
import {Header,Body,Title,Left,Right} from 'native-base'
export default class TitleBar extends Component{
    constructor(props){
        super(props)
    }
    static propsType={
        title:React.PropTypes.string,
        leftIcon:React.PropTypes.number,
        rightIcon:React.PropTypes.number,
        rightTitle:React.PropTypes.string,
        rightPress:React.PropTypes.func,
        leftPress:React.PropTypes.func,
    }
    render(){
        return (
            <Header style={{backgroundColor:'#fff'}}>
                <Left>
                    <ImageButton
                        style={styles.image_header_left}
                        source={this.props.leftIcon}
                        onPress={this.props.leftPress}>
                    </ImageButton>
                </Left>
                <Body>
                <Title style={{color:'#000'}}>
                    {this.props.title}
                </Title>
                </Body>
                <Right>
                    {this._renderRight()}
                </Right>
            </Header>
        )
    }
    /**
     * 根据传入值判断右边渲染文字还是图标
     */
    _renderRight(){
        if(this.props.rightIcon){
            return (
                <ImageButton
                    style={styles.image_header_right}
                    source={this.props.rightIcon}
                    onPress={this.props.rightPress}
                />
            )
        }else if (this.props.rightTitle){
            return (
                <Text style={styles.text_right_title}>
                    {this.props.rightTitle}
                </Text>
            )
        }
    }
}
ImageButton.js代码(图片按钮):
import React,{Component} from 'react'
import {
    Image,
    TouchableWithoutFeedback,
} from 'react-native'
export default class ImageButton extends Component{
    constructor(props){
        super(props)
    }
    render(){
        return (
            <TouchableWithoutFeedback onPress={this.props.onPress}>
                <Image
                    style={this.props.style}
                    source={this.props.source}>
                    {this.props.children}
                </Image>
            </TouchableWithoutFeedback>
        )
    }
}
效果:(点击右侧消息按钮跳转到消息页面,点击消息的回退按钮,返回到上一页面)


3.2 TabNavigator的实例


3.3 DrawerNavigator的实例





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值