react-navigation(5.x)新版本使用(一)之利用class代替function实现页面跳转

写作时间:2020/4/9
React-Native版本:0.62
React-Navigation版本:5.X

注:在对文章涉及的代码进行测试之前,请先确认你已经成功安装如下内容

// react-navigation(5.x)
npm install @react-navigation/native
npm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view
npm install @react-navigation/stack
npm install @react-navigation/bottom-tabs

新版navigation改动较大,需要重新进行梳理,想做个系列,本文主要针对官网提供的页面跳转案例进行修改,将各个页面分别进行封装,首先请先看一下官方给出的代码(这里我将原RN项目中的App.js的内容全部删去,换成如下代码)

// App.js

import * as React from 'react';
import {Button, View, Text} from 'react-native';
import {NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';

function HomeScreen({navigation}) {
    return (
        <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
            <Text>Home Screen</Text>
            <Button title="Go to Details" onPress={() => navigation.navigate('Details')} />
        </View>
    );
}

function DetailsScreen({navigation}) {
    return (
        <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
            <Text>Details Screen</Text>
            <Button title="Go to Details... again" onPress={() => navigation.push('Details')} />
            <Button title="Go to Home" onPress={() => navigation.navigate('Home')} />
            <Button title="Go back" onPress={() => navigation.goBack()} />
            <Button title="Go back to first screen in stack" onPress={() => navigation.popToTop()} />
        </View>
    );
}

const Stack = createStackNavigator();

function App() {
    return (
        <NavigationContainer>
            <Stack.Navigator initialRouteName="Home">
                <Stack.Screen name="Home" component={HomeScreen} />
                <Stack.Screen name="Details" component={DetailsScreen} />
            </Stack.Navigator>
        </NavigationContainer>
    );
}

export default App;

最终展示出来的页面如下(共有两个页面)

在这里插入图片描述

上面这个是首页

在这里插入图片描述

上面这个是详情页

通过观察不难发现,所有界面都以function进行定义,现在我利用class将各个页面以组件形式进行封装,代替原有的function,修改之后的项目结构如下图所示

在这里插入图片描述

可以看到,项目中除了原有的App.js以外,还多了HomeScreen.js和DetailsScreen.js两个文件,现将这些文件中的代码展示如下

// App.js
import React from 'react';
import HomeScreen from './HomeScreen';
import DetailsScreen from './DetailsScreen';
import {NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';

const Stack = createStackNavigator();

export default class App extends React.Component {
    render() {
        return (
            <NavigationContainer>
                <Stack.Navigator initialRouteName="Home">
                    <Stack.Screen name="Home" component={HomeScreen} />
                    <Stack.Screen name="Details" component={DetailsScreen} />
                </Stack.Navigator>
            </NavigationContainer>
        );
    }
}
// HomeScreen.js
import React from 'react';
import {View, Text, Button} from 'react-native';

export default class HomeScreen extends React.Component {
    render() {
        return (
            <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
                <Text>Home Screen</Text>
                <Button title="Go to Details" onPress={() => this.props.navigation.navigate('Details')} />
            </View>
        );
    }
}
// DetailsScreen.js
import React from 'react';
import {View, Text, Button} from 'react-native';

export default class DetailsScreen extends React.Component {
    render() {
        return (
            <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
                <Text>Details Screen</Text>
                <Button title="Go to Details... again" onPress={() => this.props.navigation.push('Details')} />
                <Button title="Go to Home" onPress={() => this.props.navigation.navigate('Home')} />
                <Button title="Go back" onPress={() => this.props.navigation.goBack()} />
                <Button title="Go back to first screen in stack" onPress={() => this.props.navigation.popToTop()} />
            </View>
        );
    }
}

最终执行的效果其实是一样的,但是由于进行了封装,会为后续的开发提供便利,整个项目结构也会更加清晰。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值