初识react-navigation3.x

作者: 背着梦的幸存者 | 来源:发表于2019-02-22 15:36 被阅读10次

    新建项目:react-native init demo
    安装react-navgation3.x

    yarn add react-navigation
    # or with npm
    # npm install --save react-navigation
    

    react-native-gesture-handler组件库为react-navgation使用的第三方库,只要作用于手势左右滑动。

    yarn add react-native-gesture-handler
    # or with npm
    # npm install --save react-native-gesture-handler
    react-native link react-native-gesture-handler
    

    在React Navigation中有以下导航器:
    createStackNavigator: 类似于普通的Navigator,屏幕上方导航栏;;
    createBottomTabNavigator:屏幕底部Tab;
    createMaterialTopTabNavigator:屏幕顶部Tab;
    createDrawerNavigator: 抽屉效果;
    createSwitchNavigator:一次只显示一个页面,无法执行回退操作。
    新建AppNavigator.js文件,将index.js文件中的入口文件替换掉。

    const InitNavigator=createStackNavigator({
        WelcomePage:{
            screen:WelcomePage,
            navigationOptions:{
                header:null,//可以通过header:null来禁用StackNavigator默认的Navigation
            }
        }
    });
    
    
    const MainNavigator=createStackNavigator({
        HomePage:{
            screen:HomePage,
            navigationOptions:{
                header:null
            }
        },
        DetailPage:{
            screen:DetailPage,
            navigationOptions:{
                header:null
            }
        }
    });
    
    export default createAppContainer(createSwitchNavigator({
        Init:InitNavigator,
        Main:MainNavigator
    },{
        navigationOptions:{
            header:null
        }
    }))
    

    此处为两个导航器:InitNavigator和MainNavigator,用createSwitchNavigator控制其一次只显示一个导航器。
    为方便跳转回退等操作,可以封装NavigationUtil.js文件。

    export default class NavigationUtil{
        /**
         * 跳转到指定页面
         * @param params 要传递的参数
         * @param page 要跳转的页面名
         **/
        static goPage(params, page) {
            const navigation = NavigationUtil.navigation;
            if (!navigation) {
                console.log('NavigationUtil.navigation can not be null')
                return;
            }
            navigation.navigate(
                page,
                {
                    ...params
                }
            )
        }
        /**
         * 返回上一页
         * @param navigation
         */
        static goBack(navigation) {
            navigation.goBack();
        }
        /**
         * 重置到首页
         * @param navigation
         */
        static resetToHomePage(params) {
            const {navigation} = params;
            navigation.navigate("Main");
        }
    }
    

    因为涉及跨导航之间的跳转操作,故用NavigationUtil.navigation来起到缓存navigation对象的作用,方便跳转等操作。
    在HomePage中使用BottomTabNavigator

    type Props = {};
    export default class HomePage extends Component<Props> {
        _tabNavigator() {
            return createAppContainer(createBottomTabNavigator({
                PopularPage: {
                    screen: PopularPage,
                    navigationOptions: {
                        tabBarLabel: '最热',
                        tabBarIcon:({tintColor, focused}) => (
                            <MaterialIcons
                                name={'whatshot'}
                                size={26}
                                style={{color: tintColor}}
                            />
                        ),
                    }
                },
                TrendingPage: {
                    screen: TrendingPage,
                    navigationOptions: {
                        tabBarLabel: '趋势',
                        tabBarIcon: ({tintColor, focused}) => (
                            <Ionicons
                                name={'md-trending-up'}
                                size={26}
                                style={{color: tintColor}}
                            />
                        ),
                    }
                },
                FavoritePage: {
                    screen: FavoritePage,
                    navigationOptions: {
                        tabBarLabel: '收藏',
                        tabBarIcon: ({tintColor, focused}) => (
                            <MaterialIcons
                                name={'favorite'}
                                size={26}
                                style={{color: tintColor}}
                            />
                        ),
                    }
                },
                MyPage: {
                    screen: MyPage,
                    navigationOptions: {
                        tabBarLabel: '我的',
                        tabBarIcon: ({tintColor, focused}) => (
                            <Entypo
                                name={'user'}
                                size={26}
                                style={{color: tintColor}}
                            />
                        ),
                    }
                }
            }))
        }
    
        render() {
            NavigationUtil.navigation=this.props.navigation
            const Tab = this._tabNavigator();
            return (
                <Tab/>
            );
        }
    }
    

    此处可配合react-native-vector-icons第三方图标库使用。
    在PopularPage.js文件中使用MaterialTopTabNavigator

    type Props = {};
    export default class PopularPage extends Component<Props> {
        render() {
            const TabNavigator = createAppContainer(createMaterialTopTabNavigator({
                PopularTab1: {
                    screen: ()=><PopularTab tabLabel={'TAB1'}/>,
                    navigationOptions: {
                        title: 'tab1'
                    }
                },
                PopularTab2: {
                    screen: PopularTab,
                    navigationOptions: {
                        title: 'tab2'
                    }
                }
            }));
            return (<View style={{flex:1,marginTop:30}}><TabNavigator/></View>);
        }
    }
    
    class PopularTab extends Component<Props> {
        render() {
            const {tabLabel} = this.props;
            return (
                <View style={styles.container}>
                    <Text style={styles.welcome}>{tabLabel}</Text>
                    <Text onPress={()=>{
                        NavigationUtil.goPage({},'DetailPage')
                    }}>跳转到详情页</Text>
                </View>
            );
        }
    }
    

    此页面在HomePage的导航器中,所以直接用props的中navigation对象进行跳转的时候需要在HomePage中缓存navigation对象才可以进行操作。

    相关文章

      网友评论

        本文标题:初识react-navigation3.x

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