美文网首页
react-native组件(1)--(react-naviga

react-native组件(1)--(react-naviga

作者: 吃肉666 | 来源:发表于2017-08-08 14:17 被阅读58次

    react-navigation组件网上搜一搜好多好多,但是自己照着做还是会遇到各种问题各种坑。为了以后再用不会忘记在这里留下一份使用笔记,以供以后参考
    1.从一个新项目开始
    react-native init RnNavDemo

    1. 下载react-navigation
      npm install --save react-navigation

    打开package.json 在dependencies中有看到"react-navigation": "^1.0.0-beta.11" 就安装成功了,可以使用了

    1. 创建app.js(名字随便起,反正创建一个新的js文件就是了)
      在app.js中创建tabbar和navigation
    
    import {
        Image,
        StyleSheet,
        Text,
        AsyncStorage
    } from 'react-native';
    
    import {
        StackNavigator,
        TabNavigator,
    } from 'react-navigation';
    import React from 'react';
    
    import CardStackStyleInterpolator from 'react-navigation/src/views/CardStackStyleInterpolator';
    import Test1 from './Test1.js';
    import Test2 from './Test2.js';
    import Test3 from './Test3.js';
    import Detail1 from './Detail1.js';
    import Detail2 from './Detail2.js';
    
    const ShiTuIcon = require('./resources/icon_tabbar_merchant_normal.png');
    
    const MainIcon = require('./resources/Main.png');
     /**
         * 1、Test1是通过普通的属性创建的Tabbar和导航
         * 2、Test2是在页面中通过属性创建Tabbar和导航
         * 3、Test3是通过封装navigationOptions实现Tabbar和导航的
         */
    const MyTab = TabNavigator({
        Test1: {
            screen: Test1,
            navigationOptions:({navigation,screenProps}) => ({
    
                // StackNavigator 属性部分
    
                // title:'Test1', 同步设置导航和tabbar文字,不推荐使用
                headerTitle:'首页', // 只会设置导航栏文字,
                // header:{}, // 可以自定义导航条内容,如果需要隐藏可以设置为null
                // headerBackTitle:null, // 设置跳转页面左侧返回箭头后面的文字,默认是上一个页面的标题。可以自定义,也可以设置为null
                // headerTruncatedBackTitle:'', // 设置当上个页面标题不符合返回箭头后的文字时,默认改成"返回"。
                // headerRight:{}, // 设置导航条右侧。可以是按钮或者其他。
                // headerLeft:{}, // 设置导航条左侧。可以是按钮或者其他。
                headerStyle:{
                    backgroundColor:'#4ECBFC'
                }, // 设置导航条的样式。如果想去掉安卓导航条底部阴影可以添加elevation: 0,iOS去掉阴影是。
                headerTitleStyle:{
                    fontSize:30,
                    color:'white',
                    alignSelf:'center', //(坑1,不加这个安卓的title在左边的)
                }, // 设置导航条文字样式。安卓上如果要设置文字居中,只要添加alignSelf:'center'就可以了
                // headerBackTitleStyle:{}, // 设置导航条返回文字样式。
                // headerTintColor:'green', // 设置导航栏文字颜色。总感觉和上面重叠了。
                gesturesEnabled:true, // 是否支持滑动返回收拾,iOS默认支持,安卓默认关闭
    
    
                // TabNavigator 属性部分
    
                // title:'', 同上
                tabBarVisible:true, // 是否隐藏标签栏。默认不隐藏(true)
                tabBarIcon: (({tintColor,focused}) => {
                    return(
                        <Image
                            source={!focused ? ShiTuIcon : ShiTuIcon}
                            style={[{height:35,width:35 }, {tintColor: tintColor}]}
                        />
                    )
                }), // 设置标签栏的图标。需要单独设置。
                tabBarLabel:'首页', // 设置标签栏的title。推荐这个方式。
            })
        },
        Test2: {
            screen:Test2,
        },
        Test3:{
            screen:Test3,
            navigationOptions: ()=> TabOptions('我的',MainIcon,MainIcon,'我的'),
        },
    },{
        tabBarPosition:'bottom', // 设置tabbar的位置,iOS默认在底部,安卓默认在顶部。(属性值:'top','bottom')
        swipeEnabled:false, // 是否允许在标签之间进行滑动。
        animationEnabled: false, // 是否在更改标签时显示动画。
        lazy:true, // 是否根据需要懒惰呈现标签,而不是提前制作,意思是在app打开的时候将底部标签栏全部加载,默认false,推荐改成true哦。
        initialRouteName:'', // 设置默认的页面组件
        backBehavior:'none', // 按 back 键是否跳转到第一个Tab(首页), none 为不跳转
        tabBarOptions:{
            // iOS属性
            // 因为第二个tabbar是在页面中创建的,所以前景色的设置对其无效,当然也可以通过设置tintColor使其生效
            activeTintColor:'red', // label和icon的前景色 活跃状态下(选中)。
            inactiveTintColor:'orange', // label和icon的前景色 不活跃状态下(未选中)。
    
            activeBackgroundColor:'blue', //label和icon的背景色 活跃状态下(选中) 。
            inactiveBackgroundColor:'green', // label和icon的背景色 不活跃状态下(未选中)。
    
            showLabel:true, // 是否显示label,默认开启。
            // style:{}, // tabbar的样式。
            // labelStyle:{}, //label的样式。
    
            // 安卓属性
    
            // activeTintColor:'', // label和icon的前景色 活跃状态下(选中) 。
            // inactiveTintColor:'', // label和icon的前景色 不活跃状态下(未选中)。
            showIcon:true, // 是否显示图标,默认关闭。
            // showLabel:true, //是否显示label,默认开启。
            // style:{}, // tabbar的样式。
            // labelStyle:{}, // label的样式。
            upperCaseLabel:false, // 是否使标签大写,默认为true。
            // pressColor:'', // material涟漪效果的颜色(安卓版本需要大于5.0)。
            // pressOpacity:'', // 按压标签的透明度变化(安卓版本需要小于5.0)。
            // scrollEnabled:false, // 是否启用可滚动选项卡。
            // tabStyle:{}, // tab的样式。
            // indicatorStyle:{}, // 标签指示器的样式对象(选项卡底部的行)。安卓底部会多出一条线,可以将height设置为0来暂时解决这个问题。
            // labelStyle:{}, // label的样式。
            // iconStyle:{}, // 图标的样式。
        }
    
    });
    
    
    
    // 初始化StackNavigator
    const MyNav = StackNavigator({
        // 将TabNavigator包裹在StackNavigator里面可以保证跳转页面的时候隐藏tabbar
        MyTab:{
            screen:MyTab,
        },
        // 将需要跳转的页面注册在这里,全局才可以跳转
        Detail1:{
            screen:Detail1
        },
        Detail2:{
            screen:Detail2,
        },
    
    },{
    
    //安卓默认动画是从下到上弹出的,加上这句就和iOS一样的push效果(坑2)
    transitionConfig:()=>({
            screenInterpolator:CardStackStyleInterpolator.forHorizontal,
        })
    });
    
    const TabOptions = (tabBarTitle,normalImage,selectedImage,navTitle) => {
        // console.log(navigation);
        const tabBarLabel = tabBarTitle;
        const tabBarIcon = (({tintColor,focused})=> {
            return(
                <Image
                    source={!focused ? normalImage : selectedImage}
                    style={[{height:35,width:35 }, {tintColor: tintColor}]}
                />
            )
        });
        const headerTitle = navTitle;
        const headerTitleStyle = {fontSize:22,color:'white',alignSelf:'center'};
        // header的style
        const headerStyle = {backgroundColor:'#4ECBFC'};
        const tabBarVisible = true;
        // const header = null;
        return {tabBarLabel,tabBarIcon,headerTitle,headerTitleStyle,headerStyle,tabBarVisible};
    };
    
    export default MyNav;
    

    test1.js

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
        AppRegistry,
        StyleSheet,
        Text,
        View
    } from 'react-native';
    
    export default class Test1 extends Component {
        render() {
            return (
                <View style={styles.container}>
                    <Text style={styles.welcome}>
                        Welcome to Test1 !
                    </Text>
                    <Text style={styles.instructions} onPress={()=>{
                        const { navigate } = this.props.navigation;
                        navigate('Detail1');
                    }}>
                        点我跳转到Detail1
                    </Text>
                    <Text style={styles.instructions}>
                        当前页面的Tabbar是在App.js中通过最普通的方式自定义。
                    </Text>
                    <Text style={styles.instructions} onPress={()=>{
                        const { navigate } = this.props.navigation;//这是拿到当前页面属性中的navigate
                        navigate('Detail2');//跳转到Detail2页面
                    }}>
                        在Detail2中有reset和navigate的使用方法(点文字跳转)
                    </Text>
    
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            flex: 1,
            justifyContent: 'center',
            alignItems: 'center',
            backgroundColor: '#F5FCFF',
        },
        welcome: {
            fontSize: 20,
            textAlign: 'center',
            margin: 10,
        },
        instructions: {
            marginTop:10,
            textAlign: 'center',
            color: '#333333',
            marginBottom: 5,
            fontSize: 18,
        },
    });
    

    Detail1.js

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
        AppRegistry,
        StyleSheet,
        Text,
        View
    } from 'react-native';
    
    export default class Detail1 extends Component {
    
        static navigationOptions = ({navigation,screenProps}) => ({
            // 这里面的属性和App.js的navigationOptions是一样的。
            headerTitle:navigation.state.params?navigation.state.params.headerTitle:'Detail1',
            headerRight:(
                <Text style={{color:'red',marginRight:20}} onPress={()=>navigation.state.params?navigation.state.params.navigatePress():null}>我的</Text>
            ),
        });
    
        componentDidMount(){
            // 通过在componentDidMount里面设置setParams将title的值动态修改
            this.props.navigation.setParams({
                headerTitle:'Detail1',
                navigatePress:this.navigatePress,
            });
        }
    
        navigatePress = () => {
            alert('点击headerRight');
        }
    
        render() {
            return (
                <View style={styles.container}>
                    <Text style={styles.welcome}>
                        Welcome to Detail1!
                    </Text>
                    <Text style={styles.instructions} onPress={()=>{
                        const { navigate } = this.props.navigation;
                        navigate('Detail2');
                    }}>
                        跳转到Detail2
                    </Text>
    
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            flex: 1,
            justifyContent: 'center',
            alignItems: 'center',
            backgroundColor: '#F5FCFF',
        },
        welcome: {
            fontSize: 20,
            textAlign: 'center',
            margin: 10,
    
        },
        instructions: {
            textAlign: 'center',
            color: '#333333',
            marginBottom: 5,
            fontSize:18
        },
    });
    
    
    

    Detail2.js

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
        AppRegistry,
        StyleSheet,
        Text,
        View,
        Button
    } from 'react-native';
    
    //导入自定义的导航栏,在header中使用
    import NavStyle from './NavStyle.js';
    
    import { NavigationActions } from 'react-navigation'
    
    //跳转到root页面(pop到mytab)
    const resetAction = NavigationActions.reset({
        index: 0,
        actions: [
            NavigationActions.navigate({ routeName: 'MyTab' })
        ]
    });
    
    //跳转到指定页面(push到Detail1)
    const navigateAction = NavigationActions.navigate({
        routeName: 'Detail1',
    
        params: {headerTitle:'hahaha'},
    
        action: NavigationActions.navigate({ routeName: 'Detail1'})
    })
    
    export default class Detail2 extends Component {
        static navigationOptions = ({navigation,screenProps}) => ({
            // 这里面的属性和App.js的navigationOptions是一样的。
            header:(
                <NavStyle leftClick={()=>navigation.state.params?navigation.state.params.navigatePress():null}/>
            )
        })
    
        componentDidMount(){
            // 通过在componentDidMount里面设置setParams将title的值动态修改
            this.props.navigation.setParams({
                navigatePress:this.navigatePress
            });
        }
    
    //pop到上一页
        navigatePress = () => {
            const { goBack } = this.props.navigation;
            goBack();
        }
    
        render() {
            return (
                <View style={styles.container}>
                    <Text style={styles.welcome}>
                        Welcome to Detail2!
                    </Text>
                    <Text style={styles.instructions}>
                        本页面的导航栏是纯自定义的,点击事件需要通过setParams来添加
                    </Text>
                    <Button title={'reset'} onPress={()=>{
                        this.props.navigation.dispatch(resetAction)
                    }} />
                    <Button title={'navigate'} onPress={()=>{
                        this.props.navigation.dispatch(navigateAction)
                    }}/>
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            flex: 1,
            justifyContent: 'center',
            alignItems: 'center',
            backgroundColor: '#F5FCFF',
        },
        welcome: {
            fontSize: 20,
            textAlign: 'center',
            margin: 10,
        },
        instructions: {
            textAlign: 'center',
            color: '#333333',
            marginBottom: 5,
            fontSize:18
        },
    });
    
    

    demo地址https://github.com/tmd2013/react-navigation-use.git

    相关文章

      网友评论

          本文标题:react-native组件(1)--(react-naviga

          本文链接:https://www.haomeiwen.com/subject/ohdtrxtx.html