React-Native导航教程:使用react-navigation实现Tab与页面跳转

Viewed 0

React-Native 导航之 react-navigation

一、每个 App 都少不了的导航功能

无论是底部 Button 切换还是页面跳转,这些导航功能构成了 App 的基本骨架,之后才能用业务逻辑填充。在 React-Native 中,Facebook 曾推出过导航组件,但面对复杂业务时性能体验较差。因此,第三方导航组件 react-navigation 应运而生,并且得到了 Facebook 的官方推荐。该组件主要包含三个核心功能组件:TabNavigator、StackNavigator 和 DrawerNavigation,分别实现 Tab 导航、页面跳转和抽屉效果(侧滑菜单)。本文将重点介绍前两个组件的使用方法。

二、本次要实现的目标效果

本教程旨在实现两个主要效果:主界面底部具有三个切换 Tab 的导航栏,以及从首页跳转到二级页面的功能。下面将通过代码逐步实现这些功能。

三、使用 TabNavigator 实现底部导航

1. 安装

首先,通过 npm 安装 react-navigation:

npm install --save react-navigation

安装完成后,可以检查 package.json 文件中的 dependencies 部分是否包含 react-navigation,或者在 node_modules 文件夹中确认组件包是否存在。

2. 路由配置

实现底部 Tab 导航需要两个步骤:创建对应的页面组件,然后配置路由。我们创建三个页面:MainPage(首页)、SettingPage(设置页)和 MinePage(我的页面)。

以 MainPage.js 为例:

import React, { Component } from 'react';
import {
    StyleSheet,
    Text,
    Image,
    View
} from 'react-native';

export default class MainPage extends Component {
    static navigationOptions = {
        headerTitle: '首页',
        tabBarLabel: '首页',
        tabBarIcon: <Image style={{height: 30, width: 30}} source={require('./ic_tab_mine.png')}/>
    };

    render() {
        const { navigate } = this.props.navigation;
        return (
            <View style={styles.container}>
                <Text>首页界面</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
    },
});

其他两个页面类似。接下来,创建路由配置文件 MyNavigators.js:

import React from 'react';
import {StackNavigator, TabNavigator} from 'react-navigation';
import MainPage from '../pages/MainPage';
import SettingPage from '../pages/SettingPage';
import MinePage from '../pages/MinePage';
import DetailsPage from '../pages/DetailsPage';

const Tabs = TabNavigator({
    Home: { screen: MainPage },
    Set: { screen: SettingPage },
    Me: { screen: MinePage }
}, {
    animationEnabled: false,
    tabBarPosition: 'bottom',
    swipeEnabled: false,
    backBehavior: 'none',
    tabBarOptions: {
        activeTintColor: '#ff8500',
        inactiveTintColor: '#999',
        showIcon: true,
        indicatorStyle: { height: 0 },
        style: { backgroundColor: '#fff' },
        labelStyle: { fontSize: 14 },
    },
});

export default StackNavigator({
        Main: { screen: Tabs },
        DetailsPage: { screen: DetailsPage },
    },
    {
        headerMode: 'screen',
        initialRouteName: 'Main',
        mode: 'modal'
    });

TabNavigator 接收两个参数:Tab 目标页面和样式配置。StackNavigator 用于注册所有页面组件,类似于 Android 中的 Activity 注册。

3. 集成使用

创建 App.js 文件引入路由组件:

import React, {Component} from 'react';
import MyNavigators from './src/navigators/MyNavigators';

export default class App extends Component {
    render() {
        return <MyNavigators/>;
    }
}

然后修改 index.js 加载 App.js:

import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('AbcAPP', () => App);

运行程序即可看到底部导航 Tab。

四、使用 StackNavigator 实现页面跳转

在 StackNavigator 中注册过的组件都会拥有 navigation 属性,其中 navigate 方法可用于跳转,支持参数传递。例如,在 MainPage 中添加跳转到详情页的入口:

MainPage.js 中修改 render 方法:

render() {
    const { navigate } = this.props.navigation;
    return (
        <View style={styles.container}>
            <TouchableOpacity 
                style={{width:200, height: 50, backgroundColor: 'red', borderRadius:5, justifyContent: 'center', alignItems: 'center'}}
                onPress={() => navigate('DetailsPage', { title: '详情页', des: '回到上一页' })} >
                <Text style={{color:"#FFF"}}>点击查看详情</Text>
            </TouchableOpacity>
        </View>
    );
}

DetailsPage.js 详情页组件:

import React, {Component} from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';

export default class DetailsPage extends Component {
    static navigationOptions = ({navigation}) => ({
        headerTitle: navigation.state.params.title,
        headerTitleStyle: { fontSize:18, fontWeight:'400', alignSelf:'center' },
        headerStyle: { height: 65, backgroundColor: '#FFF' },
        headerRight: <View><Text style={{paddingRight: 14, color: '#000', fontSize: 18}}>编辑</Text></View>,
        headerBackTitle: '回去',
        headerTruncatedBackTitle: '返回'
    });

    backFunction = () => {
        this.props.navigation.goBack();
    }

    render() {
        return (
            <View style={styles.container}>
                <TouchableOpacity
                    style={{width:200, height: 50, backgroundColor: 'green', borderRadius:5, justifyContent: 'center', alignItems: 'center'}}
                    onPress={this.backFunction}>
                    <Text style={{color:"#FFF"}}>{this.props.navigation.state.params.des}</Text>
                </TouchableOpacity>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
        alignItems:'center',
        justifyContent:'center'
    },
});

通过以上步骤,我们完成了 React-Native 中 react-navigation 的基本使用,实现了底部 Tab 导航和页面跳转功能。实际开发中,可根据需求调整样式和配置。

0 Answers