Tutorial

Verwenden von Routing mit React Navigation in React Native

Published on December 2, 2020
Default avatar

By Zeb Girouard

Deutsch
Verwenden von Routing mit React Navigation in React Native

Einführung

React Navigation ist eine beliebte Bibliothek für das Routing und die Navigation in einer React Native-Anwendung.

Diese Bibliothek hilft bei der Navigation zwischen mehreren Bildschirmen und dem Austausch von Daten zwischen ihnen.

Am Ende dieses Tutorials haben Sie ein rudimentäres soziales Netzwerk. Es zeigt die Anzahl der Freundschaften eines Benutzers an und bietet eine Möglichkeit, sich mit zusätzlichen Freunden zu verbinden. Sie verwenden diese Beispielanwendung zur Erkundung, wie Sie mobile App-Bildschirme mit react-navigation navigieren können.

Voraussetzungen

Um dieses Tutorial zu absolvieren, benötigen Sie:

Hinweis: Wenn Sie in der Vergangenheit mit react-navigation gearbeitet haben, können Sie ggf. auf einige Unterschiede stoßen. Sie können die Dokumentation für Leitfäden zur Migration von 3.x und Migration von 4.x konsultieren.

Dieses Tutorial wurde mit Node v14.7.0, npm v6.14.7, react v16.13.1, react-native v0.63.2, @react-navigation/native v5.7.3 und @react-navigation/stack v5.9.0 verifiziert.

Schritt 1 — Erstellen einer neuen React Native-Anwendung

Erstellen Sie zunächst eine neue React Native-Anwendung, indem Sie den folgenden Befehl in Ihrem Terminal eingeben:

  1. npx react-native init MySocialNetwork --version 0.63.2

Navigieren Sie dann zum neuen Verzeichnis:

  1. cd MySocialNetwork

Und starten Sie die Anwendung für iOS:

  1. npm run ios

Alternativ für Android:

  1. npm run android

Hinweis: Wenn Probleme auftreten, müssen Sie möglicherweise Probleme bei der Fehlerbehebung für die React Native-CLI konsultieren.

Dadurch wird ein grundlegendes Projekt für Sie erstellt. Es sieht noch nicht wirklich wie ein soziales Netzwerk aus. Wir werden das beheben.

Öffnen Sie App.js:

  1. nano App.js

Ersetzen Sie den Inhalt von App.js durch den folgenden Code, um eine Willkommensnachricht anzuzeigen:

App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

class App extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>Welcome to MySocialNetwork!</Text>
      </View>
    );
  }
}

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

export default App;

Speichern Sie die Datei. Wenn Sie nun die Anwendung ausführen, wird die Nachricht Willkommen bei MySocialNetwork! in Ihrem Simulator angezeigt.

Im nächsten Schritt fügen Sie weitere Bildschirme zu Ihrer Anwendung hinzu.

Schritt 2 — Erstellen eines HomeScreen und eines FriendsScreen

Derzeit haben Sie einen einzigen Bildschirm, der eine Willkommensnachricht anzeigt. In diesem Schritt erstellen Sie die folgenden beiden Bildschirme für Ihre Anwendung: HomeScreen und FriendsScreen.

HomeScreen

Ihre Anwendung wird einen HomeScreen benötigen. Der HomeScreen zeigt die Anzahl der Freunde an, die bereits in Ihrem Netzwerk sind.

Nehmen Sie den Code von App.js und fügen Sie ihn zu einer neuen Datei namens HomeScreen.js hinzu.

  1. cp App.js HomeScreen.js

Öffnen Sie HomeScreen.js:

  1. nano HomeScreen.js

Ändern Sie HomeScreen.js, um HomeScreen anstelle von App zu verwenden.

HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

class HomeScreen extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>You have (undefined) friends.</Text>
      </View>
    );
  }
}

// ...

export default HomeScreen;

Dieser Code erstellt eine Platzhalternachricht für Du hast (undefiniert) Freunde.. Sie werden später einen Wert angeben.

FriendsScreen

Ihre Anwendung wird auch einen FriendsScreen benötigen. Auf dem FriendsScreen können Sie neue Freunde hinzufügen.

Nehmen Sie den Code von App.js und fügen Sie ihn zu einer neuen Datei namens FriendsScreen.js hinzu.

  1. cp App.js FriendsScreen.js

Öffnen Sie FriendsScreen.js:

  1. nano FriendsScreen.js

Ändern Sie FriendsScreen.js, um FriendsScreen anstelle von App zu verwenden.

FriendsScreen.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

class FriendsScreen extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>Add friends here!</Text>
      </View>
    );
  }
}

// ...

export default FriendsScreen;

Dieser Code erstellt eine Nachricht für Hier Freunde hinzufügen!

Zu diesem Zeitpunkt haben Sie einen HomeScreen und einen FriendsScreen. Es gibt jedoch keine Möglichkeit, zwischen ihnen zu navigieren. Sie werden diese Funktionalität im nächsten Schritt erstellen.

Schritt 3 — Verwenden von StackNavigator mit React Navigation

Für die Navigation zwischen Bildschirmen verwenden Sie einen StackNavigator. Ein StackNavigator funktioniert genau wie ein Call Stack. Jeder Bildschirm, zu dem Sie navigieren, wird nach oben auf den Stack gelegt. Jedes Mal, wenn Sie auf die Back-Taste drücken, verschwinden die Bildschirme vom oberen Teil des Stacks.

Installieren Sie zunächst @react-navigation/native:

  1. npm install @react-navigation/native@5.7.3

Installieren Sie dann @react-navigation/stack und seine Peer-Abhängigkeiten:

  1. npm install @react-navigation/stack@5.9.0 @react-native-community/masked-view@0.1.10 react-native-screens@2.10.1 react-native-safe-area-context@3.1.4 react-native-gesture-handler@1.7.0

Hinweis: Wenn Sie für iOS entwickeln, müssen Sie möglicherweise zum Verzeichnis ios navigieren und pod install ausführen.

Als Nächstes kehren Sie zu App.js zurück:

  1. nano App.js

Fügen Sie NavigationContainer und createStackNavigator zu App.js hinzu.

App.js
import 'react-native-gesture-handler';
import React from 'react';
import { StyleSheet } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

Ersetzen Sie dann den Inhalt von render:

App.js
// ...

class App extends React.Component {
  render() {
    return (
      <NavigationContainer>
        <Stack.Navigator>
        </Stack.Navigator>
      </NavigationContainer>
    );
  }
}

// ...

Fügen Sie in <Stack.Navigator> verschachtelt den HomeScreen hinzu:

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

const Stack = createStackNavigator();

class App extends React.Component {
  render() {
    return (
      <NavigationContainer>
        <Stack.Navigator>
          <Stack.Screen
            name="Home"
            component={HomeScreen}
          />
        </Stack.Navigator>
      </NavigationContainer>
    );
  }
}

// ...

Dieser Code erstellt einen sehr kleinen Stack für Ihren Navigator mit nur einem Bildschirm: HomeScreen.

Fügen Sie in <Stack.Navigator> verschachtelt den FriendsScreen hinzu:

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

const Stack = createStackNavigator();

class App extends React.Component {
  render() {
    return (
      <NavigationContainer>
        <Stack.Navigator>
          <Stack.Screen
            name="Home"
            component={HomeScreen}
          />
          <Stack.Screen
            name="Friends"
            component={FriendsScreen}
          />
        </Stack.Navigator>
      </NavigationContainer>
    );
  }
}

// ...

Dieser Code fügt den FriendsScreen zum Navigator hinzu.

Hinweis: Dies unterscheidet sich von der Art und Weise, wie createStackNavigator in vorherigen Versionen von React Navigation verwendet wurde.

Nun ist sich der Navigator der beiden Bildschirme bewusst.

Hinzufügen von Schaltflächen zu HomeScreen und FriendsScreen

Fügen Sie abschließend Schaltflächen hinzu, um zwischen Ihren beiden Bildschirmen wechseln zu können.

Fügen Sie in HomeScreen.js den folgenden Code hinzu:

HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';

class HomeScreen extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>You have (undefined) friends.</Text>

        <Button
          title="Add some friends"
          onPress={() =>
            this.props.navigation.navigate('Friends')
          }
        />
      </View>
    );
  }
}

// ...

Fügen Sie in FriendsScreen.js den folgenden Code hinzu:

FriendsScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';

class FriendsScreen extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>Add friends here!</Text>

        <Button
          title="Back to home"
          onPress={() =>
            this.props.navigation.navigate('Home')
          }
        />
      </View>
    );
  }
}

// ...

Sprechen wir über this.props.navigation. Solange Ihr Bildschirm im StackNavigator enthalten ist, erbt er automatisch viele nützliche Props aus dem Objekt navigation. In diesem Fall haben Sie navigate verwendet, um zu einer anderen Seite zu wechseln.

HomeScreen und FriendsScreen

Wenn Sie nun Ihren Simulator öffnen, können Sie zwischen HomeScreen und FriendsScreen navigieren.

Schritt 4 — Verwenden von Context zur Weitergabe von Daten an andere Bildschirme

In diesem Schritt erstellen Sie ein Array mit möglichen Freunden — Alice, Bob und Sammy — und ein leeres Array mit aktuellen Freunden. Sie werden auch eine Funktion erstellen, mit der der Benutzer mögliche Freunde zu seinen aktuellen Freunden hinzufügen kann.

Öffnen Sie App.js:

  1. nano App.js

Fügen Sie possibleFriends und currentFriends zum Zustand der Komponente hinzu:

App.js
// ...

class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      possibleFriends: [
        'Alice',
        'Bob',
        'Sammy',
      ],
      currentFriends: [],
    }
  }

  // ...
}

// ...

Fügen Sie als Nächstes eine Funktion hinzu, mit der sich ein möglicher Freund in die Liste aktueller Freunde verschieben lässt:

App.js
// ...

class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      possibleFriends: [
        'Alice',
        'Bob',
        'Sammy',
      ],
      currentFriends: [],
    }
  }

  addFriend = (index) => {
    const {
      currentFriends,
      possibleFriends,
    } = this.state

    // Pull friend out of possibleFriends
    const addedFriend = possibleFriends.splice(index, 1)

    // And put friend in currentFriends
    currentFriends.push(addedFriend)

    // Finally, update the app state
    this.setState({
      currentFriends,
      possibleFriends,
    })
  }

  // ...
}

// ...

Jetzt haben Sie die Funktionalität zum Hinzufügen von Freunden fertiggestellt.

Hinzufügen von FriendsContext zu App

Jetzt können Sie Freunde in App.js hinzufügen, aber Sie wollen auch, dass sie zu FriendsScreen.js hinzugefügt und in HomeScreen.js angezeigt werden. Da dieses Projekt mit React erstellt wurde, können Sie diese Funktionalität mit Kontext in Ihre Bildschirme injizieren.

Hinweis: In vorherigen Versionen von React Navigation war es möglich, screenProps zu verwenden, um Daten zwischen Bildschirmen auszutauschen. In der aktuellen Version von React Navigation wird empfohlen, React Context für den Austausch von Daten zwischen Bildschirmen zu nutzen.

Um eine zirkuläre Referenz zu vermeiden, sollten Sie eine neue Datei namens FriendsContext erstellen:

  1. nano FriendsContext.js

Exportieren Sie FriendsContext:

FriendsContext
import React from 'react';

export const FriendsContext = React.createContext();

Öffnen Sie App.js:

  1. nano App.js

Fügen Sie den FriendsContext hinzu:

App.js
import 'react-native-gesture-handler';
import React from 'react';
import { StyleSheet } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { FriendsContext } from './FriendsContext';
import Home from './Home';
import Friends from './Friends';

const Stack = createStackNavigator();

class App extends React.Component {
  // ...

  render() {
    return (
      <FriendsContext.Provider>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="Home"
              component={Home}
            />
            <Stack.Screen
              name="Friends"
              component={Friends}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </FriendsContext.Provider>
    );
  }
}

// ...

Dieser Code erstellt FriendsContext als neues Context-Objekt und umschließt den NavigationContainer in einer Context.Provider-Komponente, damit alle untergeordneten Elemente im Komponentenbaum Kontextänderungen abonnieren können.

Da Sie Ansicht oder Text nicht mehr verwenden, ist es möglich, diese Importe aus react-native zu entfernen.

Sie müssen einen Wert angeben, um Daten Verbrauchern zugänglich zu machen:

App.js
// ...

class App extends React.Component {
  // ...

  render() {
    return (
      <FriendsContext.Provider
        value={
          {
            currentFriends: this.state.currentFriends,
            possibleFriends: this.state.possibleFriends,
            addFriend: this.addFriend
          }
        }
      >
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="Home"
              component={Home}
            />
            <Stack.Screen
              name="Friends"
              component={Friends}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </FriendsContext.Provider>
    );
  }
}

// ...

Dadurch werden der HomeScreen und FriendsScreen alle Kontextänderungen bei currentFriends und possibleFriends referenzieren können.

Jetzt können Sie daran arbeiten, den Kontext in Ihren Bildschirmen zu referenzieren.

Hinzufügen von FriendsContext zu HomeScreen

In diesem Schritt richten Sie die Anwendung so ein, dass die aktuelle Freundeszahl angezeigt wird.

Öffnen Sie HomeScreen.js:

  1. nano HomeScreen.js

Fügen Sie den FriendsContext hinzu:

HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { FriendsContext } from './FriendsContext';

class HomeScreen extends React.Component {
  // ...
}
HomeScreen.contextType = FriendsContext;

// ...

Dieser Code erstellt einen Class.contextType. Sie können nun auf Kontext in Ihren Bildschirmen zugreifen.

Lassen wir beispielsweise Ihren HomeScreen anzeigen, wie viele currentFriends Sie haben:

HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { FriendsContext } from './FriendsContext';

class Home extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>You have { this.context.currentFriends.length } friends!</Text>

        <Button
          title="Add some friends"
          onPress={() =>
            this.props.navigation.navigate('Friends')
          }
        />
      </View>
    );
  }
}
HomeScreen.contextType = FriendsContext;

// ...

Wenn Sie Ihre Anwendung im Simulator erneut öffnen und den HomeScreen anzeigen, sehen Sie die Nachricht: Du hast 0 Freunde!.

Hinzufügen von FriendsContext zu FriendsScreen

In diesem Schritt richten Sie die Anwendung so ein, dass die möglichen Freunde angezeigt und Schaltflächen zum Hinzufügen zu den aktuellen Freunden bereitgestellt werden.

Öffnen Sie als Nächstes FriendsScreen.js:

  1. nano FriendsScreen.js

Fügen Sie den FriendsContext hinzu:

FriendsScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { FriendsContext } from './FriendsContext';

class FriendsScreen extends React.Component {
  // ...
}
FriendsScreen.contextType = FriendsContext;

// ...

Dieser Code erstellt einen Class.contextType.

Erstellen Sie nun eine Schaltfläche zum Hinzufügen von Freunden in FriendsScreen.js:

FriendsScreen.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { FriendsContext } from './FriendsContext';

class Friends extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>Add friends here!</Text>

        {
          this.context.possibleFriends.map((friend, index) => (
            <Button
              key={ friend }
              title={ `Add ${ friend }` }
              onPress={() =>
                this.context.addFriend(index)
              }
            />
          ))
        }

        <Button
          title="Back to home"
          onPress={() =>
            this.props.navigation.navigate('Home')
          }
        />
      </View>
    );
  }
}
FriendsScreen.contextType = FriendsContext;

// ...

Wenn Sie Ihre Anwendung im Simulator erneut öffnen und den FriendsScreen anzeigen, sehen Sie eine Liste von Freunden, die hinzugefügt werden können.

HomeScreen mit 0 currentFriends und FriendScreen mit 3 possibleFriends

Wenn Sie den FriendsScreen besuchen und auf die Schaltfläche zum Hinzufügen von Freunden klicken, sehen Sie, dass die Liste von possibleFriends kleiner wird. Wenn Sie den HomeScreen besuchen, sehen Sie, dass die Anzahl der Freunde zunimmt.

Sie können nun zwischen Bildschirmen navigieren und Daten zwischen ihnen austauschen.

Zusammenfassung

In diesem Tutorial haben Sie eine React Native-Anwendung mit mehreren Bildschirmen erstellt. Mithilfe von React Navigation haben Sie eine Möglichkeit zur Navigation zwischen Bildschirmen eingerichtet. Mithilfe von React Context haben Sie eine Möglichkeit entwickelt, um Daten zwischen Bildschirmen auszutauschen.

Der komplette Quellcode für dieses Tutorial ist auf GitHub verfügbar.

Wenn Sie mehr über React Navigation erfahren möchten, sehen Sie sich die entsprechende Dokumentation an.

React Navigation ist nicht die einzige Routing- und Navigationslösung. Es gibt auch React Native Navigation, React Native Router Flux und React Router Native.

Wenn Sie mehr über React erfahren möchten, sehen Sie sich unsere Reihe Codieren in React.js an oder besuchen Sie unsere React-Themenseite für Übungen und Programmierprojekte.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
Zeb Girouard

author



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel