React Tutorial Teil 11: Dynamische Markup-Bildung und die Map-Array-Methode

Im heutigen Teil der Übersetzung des React-Schulungskurses werden wir über die Verwendung der Standard-Array-Methode map () sprechen, um die dynamische Bildung von JSX-Markups zu organisieren, die Sätze von Elementen desselben Typs beschreiben.

Bild

Teil 1: Kursübersicht, Gründe für die Beliebtheit von React, ReactDOM und JSX
Teil 2: Funktionskomponenten
Teil 3: Komponentendateien, Projektstruktur
Teil 4: übergeordnete und untergeordnete Komponenten
Teil 5: Beginn der Arbeit an einer TODO-Anwendung, Grundlagen des Stylings
Teil 6: Über einige Funktionen des Kurses, JSX und JavaScript
Teil 7: Inline-Stile
Teil 8: Fortsetzung der Arbeit an der TODO-Anwendung, Vertrautheit mit den Eigenschaften von Komponenten
Teil 9: Komponenteneigenschaften
Teil 10: Workshop zum Arbeiten mit Komponenteneigenschaften und Styling
Teil 11: Dynamische Markup-Generierung und Map-Arrays-Methode
Teil 12: Workshop, dritte Phase der Arbeit an einer TODO-Anwendung
Teil 13: Klassenbasierte Komponenten
Teil 14: Workshop zu klassenbasierten Komponenten, Komponentenstatus
Teil 15: Komponentengesundheitsworkshops
Teil 16: Die vierte Phase der Arbeit an einer TODO-Anwendung, die Ereignisbehandlung
Teil 17: Fünfte Phase der Arbeit an einer TODO-Anwendung, Änderung des Status von Komponenten
Teil 18: Die sechste Phase der Arbeit an einer TODO-Anwendung
Teil 19: Methoden des Komponentenlebenszyklus
Teil 20: Die erste Lektion in bedingtem Rendern
Teil 21: Zweite Lektion und Workshop zum bedingten Rendern
Teil 22: Die siebte Phase der Arbeit an einer TODO-Anwendung, bei der Daten aus externen Quellen heruntergeladen werden
Teil 23: Erste Lektion zum Arbeiten mit Formularen
Teil 24: Lektion der zweiten Form
Teil 25: Workshop zum Arbeiten mit Formularen
Teil 26: Anwendungsarchitektur, Container- / Komponentenmuster
Teil 27: Kursprojekt

Lektion 21. Dynamische Markup-Generierung und Map-Arrays-Methode


Original

Wir werden die Arbeit von dem Moment an fortsetzen, in dem wir die vorherige praktische Aufgabe erledigt haben. Denken Sie daran, dass der Code der Datei App.js aussah:

 import React from "react" import Joke from "./Joke" function App() {   return (       <div>           <Joke punchLine="It's hard to explain puns to kleptomaniacs because they always take things literally." />                     <Joke               question="What's the best thing about Switzerland?"               punchLine="I don't know, but the flag is a big plus!"           />                     <Joke               question="Did you hear about the mathematician who's afraid of negative numbers?"               punchLine="He'll stop at nothing to avoid them!"           />                     <Joke               question="Hear about the new restaurant called Karma?"               punchLine="There's no menu: You get what you deserve."           />                     <Joke               question="Did you hear about the actor who fell through the floorboards?"               punchLine="He was just going through a stage."           />                     <Joke               question="Did you hear about the claustrophobic astronaut?"               punchLine="He just needed a little space."           />                 </div>   ) } export default App 

Die App Komponente zeigt eine Reihe von Joke . So sieht die Anwendungsseite in dieser Arbeitsphase aus.


Bewerbungsseite

Die question und punchLine Eigenschaften werden an einige dieser Komponenten und nur an punchLine Komponenten punchLine . Die Werte für diese Eigenschaften werden jetzt im Instanziierungscode der Witzkomponente im Klartext festgelegt. In der Realität wird der Großteil der Daten, die auf den Seiten von React-Anwendungen angezeigt werden, aufgrund von HTTP-Anforderungen an bestimmte APIs in die Anwendung eingegeben. Diese APIs werden von Servern unterstützt, die Informationen aus Datenbanken entnehmen, in Form von JSON-Code formatieren und diesen Code an Client-Teile von Anwendungen senden. Wir haben noch keine solche Stufe erreicht, um API-Anforderungen zu erfüllen. Daher verwenden wir jetzt als Datenquelle eine Datei mit Daten, die durch Parsen der JSON-Antwort des Servers abgerufen werden können. Es handelt sich nämlich um eine Datei " jokesData.js "mit folgendem Inhalt:

 const jokesData = [   {       id: 1,       punchLine: "It's hard to explain puns to kleptomaniacs because they always take things literally."   },   {       id: 2,       question: "What's the best thing about Switzerland?",       punchLine: "I don't know, but the flag is a big plus!"   },   {       id: 3,       question: "Did you hear about the mathematician who's afraid of negative numbers?",       punchLine: "He'll stop at nothing to avoid them!"   },   {       id: 4,       question: "Hear about the new restaurant called Karma?",       punchLine: "There's no menu: You get what you deserve."   },   {       id: 5,       question: "Did you hear about the actor who fell through the floorboards?",       punchLine: "He was just going through a stage."   },   {       id: 6,       question: "Did you hear about the claustrophobic astronaut?",       punchLine: "He just needed a little space."   } ] export default jokesData 

Diese Datei befindet sich im src Verzeichnis unseres Projekts.


Neue Datei im src-Ordner

Tatsächlich enthält es eine Reihe von Objekten. Ein ähnliches Array kann durch Parsen der von einer bestimmten API empfangenen JSON-Daten erhalten werden. Wir exportieren aus dieser Datei ein Array von jokesData . Bei Bedarf können wir diese Datei in die Komponente importieren, in der sie benötigt wird, und uns vorstellen, dass wir nicht mit den aus der Datei entnommenen Daten arbeiten, sondern mit dem, was uns eine API zurückgegeben hat.

Nachdem wir nun ein Array von Quelldaten haben, wollen wir uns überlegen, wie diese Daten in eine Reihe von Instanzen von React-Komponenten umgewandelt werden können.

Viele Entwickler sagen, dass sie dank der Beherrschung von React mehr über JavaScript gelernt haben. Der Grund dafür ist, dass Aktionen, die denen ähneln, über die wir in anderen Frameworks wie Angular und Vue sprechen werden, mit speziellen Mitteln ausgeführt werden. In React erfolgt dies mit normalem JavaScript.

Insbesondere planen wir, einige Standardmethoden für Arrays zu verwenden, bei denen es sich um Funktionen höherer Ordnung handelt. Diese Methoden können als Argumente Funktionen akzeptieren, die von Programmierern beschrieben werden. Diese Funktionen bestimmen, was ein Aufruf der einen oder anderen Standardmethode mit den Elementen des Arrays bewirkt.

Angenommen, wir haben ein numerisches Array:

 const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Wir können dieses Array mit der Standard-Array-Methode map() und ihm eine bestimmte Funktion übergeben, die die Konvertierungsreihenfolge der Elemente dieses Arrays festlegt. In unserem Fall werden dieser Funktion nacheinander die Zahlen aus diesem Array übergeben. Eine Funktion kann mit ihnen alles tun. Danach geht das, was sie zurückgibt, in ein neues Array, in ein Element, dessen Index dem Index des verarbeiteten Elements entspricht. Wenn wir ein neues Array bilden müssen, dessen Elemente Elemente des ursprünglichen Arrays sind, multipliziert mit 2, sieht es folgendermaßen aus:

 const doubled = nums.map(function(num) {   return num * 2 }) 

Überprüfen Sie die Funktion dieses Codes:

 console.log(doubled) // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 

Wenn Sie zuvor noch keine Array-Methoden wie map() , filter() , reduce() und andere kennengelernt haben, wird empfohlen, diese zu behandeln.

Hier verwenden wir die map() -Methode, um automatisch eine Liste von Komponenteninstanzen zu generieren.

Kehren wir zu unserem Beispiel zurück. Importieren Sie die Datei App.js in die Datei App.js Es wird so gemacht:

 import jokesData from "./jokesData" 

Danach können wir im Programmcode mit dem Array jokesData . Wir werden nämlich die map() -Methode verwenden. So sieht das "Leerzeichen" dieser Methode aus.

 jokesData.map(joke => { }) 

Beachten Sie, dass wir hier die Pfeilfunktion an die map() -Methode übergeben. In unserem Fall können wir so den Code kompakter gestalten. Da die Funktion nur einen Parameter ( joke ) joke , können wir, wenn sie deklariert ist, auf Klammern verzichten.

Von der an die map() -Methode übergebenen Funktion möchten wir eine neue Instanz der Joke Komponente zurückgeben, an die die question und punchLine Eigenschaften des punchLine Array-Elements punchLine . So könnte es aussehen:

 jokesData.map(joke => {   return (   <Joke question={joke.question} punchLine={joke.punchLine} />   ) }) 

Dieser Code kann gekürzt werden, wenn zwei Fakten berücksichtigt werden. Erstens gibt return nur ein Element zurück, sodass Sie dieses Element unmittelbar nach der return einfügen können, ohne dass Klammern erforderlich sind. Zweitens enthält die Pfeilfunktion nur die Operation zum Zurückgeben eines bestimmten Werts. Wenn Sie eine solche Funktion deklarieren, können Sie daher auf das Schlüsselwort return und auf geschweifte Klammern verzichten. Darüber hinaus erinnern wir uns, dass als Ergebnis der map() -Methode ein neues Array gebildet wird. Dieses Array muss irgendwo gespeichert werden. All diese Überlegungen führen uns zu Folgendem:

 const jokeComponents = jokesData.map(joke => <Joke question={joke.question} punchLine={joke.punchLine} />) 

Die jokeComponents Konstante enthält jetzt ein Array, von dem jedes Element eine Beschreibung einer Instanz der Joke Komponente mit den ihr übergebenen question und punchLine Eigenschaften ist.

Was machen wir jetzt mit diesem Array von Komponenten? React macht es sehr bequem, mit solchen Arrays zu arbeiten. Wir sprechen nämlich über die Tatsache, dass ein solches Array in JSX-Code verwendet werden kann. So sieht der App Dateicode jetzt aus:

 import React from "react" import Joke from "./Joke" import jokesData from "./jokesData" function App() {   const jokeComponents = jokesData.map(joke => <Joke question={joke.question} punchLine={joke.punchLine} />)       return (       <div>           {jokeComponents}       </div>   ) } export default App 

Danach sieht die Anwendungsseite genauso aus wie zuvor. In der Browserkonsole wird jedoch die folgende Warnung angezeigt:

 Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `App`. See https://fb.me/react-warning-keys for more information.   in Joke (at App.js:7)   in App (at src/index.js:6) 

Seine Bedeutung beruht auf der Tatsache, dass Array-Elemente eine eindeutige key haben müssen. Wir werden nicht näher darauf eingehen, warum React die eindeutige key doppelter Komponenten erwartet. Es reicht aus, die Tatsache zu berücksichtigen, dass Instanzen bei der Massenerstellung von Komponenteninstanzen, wie wir sie gerade mit der map() -Methode durchgeführt haben, die key . Darüber hinaus kann eine solche Eigenschaft an die Komponenteninstanz selbst und beispielsweise an das <div> , in dem der Komponentencode enthalten ist. Dies spielt keine besondere Rolle.

Daher muss der key ein eindeutiger Wert zugewiesen werden. In der Regel gibt es in Datenobjekten, die von der API empfangen werden, einige Bezeichner (Eigenschaften wie id ). Die Hauptsache für uns ist ihre Einzigartigkeit. Zum Beispiel könnten wir die key auf joke.question - alle Texte in diesen Eigenschaften sind in unserer Anwendung eindeutig. Aber wir werden es anders machen. Denken Sie daran, wie die Objekte mit Daten aus dem Array jokesData.js , die wir aus der Datei jokesData.js exportiert haben. Hier ist ein Fragment davon:

 const jokesData = [   {       id: 1,       punchLine: "It's hard to explain puns to kleptomaniacs because they always take things literally."   },   {       id: 2,       question: "What's the best thing about Switzerland?",       punchLine: "I don't know, but the flag is a big plus!"   }, ... ] 

Jedes Objekt hat eine id Eigenschaft, deren Einzigartigkeit wir unabhängig voneinander beibehalten. Es sind die Werte solcher Eigenschaften, die als Werte für die key .

Der Code zum Erstellen eines Arrays von Komponenteninstanzen in App.js hat nun die folgende Form:

 const jokeComponents = jokesData.map(joke => <Joke key={joke.id} question={joke.question} punchLine={joke.punchLine} />) 

Wenn Sie diese Änderung im Code vornehmen, die Anwendungsseite im Browser aufrufen und den Inhalt der Konsole überprüfen, stellt sich heraus, dass die Benachrichtigung über die key verschwunden ist.

Nach all den Transformationen, die wir dem Projekt unterzogen haben, hat sich das Erscheinungsbild der Anwendungsseite nicht geändert. Der Code der App Komponente ist jedoch viel kürzer und klarer geworden, und die Daten zum Erstellen der Liste der Komponenten stammen jetzt aus einer externen Datenquelle. Auf diese Weise funktionieren echte Anwendungen.

Darüber hinaus sollte beachtet werden, dass der Kern der obigen Codemodifikation die Verwendung der Standard-Array-Methode map() . Wir haben die Technik des Erstellens einer Liste von Instanzen der Joke Komponente in der App Komponente verwendet, aber nichts hindert uns bei Bedarf daran, denselben Ansatz in der Joke Komponente zu verwenden, die basierend auf den an sie übertragenen Daten eine eigene Liste von Instanzen einer bestimmten Komponente erstellen kann.

Gleichzeitig finden Sie, wie bereits erwähnt, unter den Standardmethoden für Arrays weitere interessante Tools. Beispielsweise kann die sort() -Methode verwendet werden, um Array-Elemente nach einem Attribut zu sortieren. Mit der filter() -Methode können nur die Array-Elemente ausgewählt werden, die bestimmte Kriterien erfüllen. All dies gilt für die Arbeit mit Arrays, die Instanzen von Komponenten enthalten.

Wenn Sie möchten, können Sie mit diesen Methoden experimentieren. Angenommen, Sie verwenden die filter() -Methode und entfernen aus der von der App Komponente generierten Instanzen die Instanzen der Joke Komponente, deren Frageeigenschaft die angegebene Länge nicht überschreitet. Oder stellen Sie sicher, dass punchLine nur Komponenten punchLine werden punchLine für die sowohl die question Eigenschaft als auch die punchLine Eigenschaft festgelegt sind.

Zusammenfassung


Heute haben wir über die Verwendung der Standard-Array-Methode map() zum Kompilieren von Komponentenlisten gesprochen und auch die Möglichkeiten diskutiert, die uns andere Standard-Array-Methoden bieten. Das nächste Mal erhalten Sie eine praktische Lektion zu dem heute untersuchten Material.

Liebe Leser! Wie würden Sie das Problem lösen, dass von der App-Komponente nur die Instanzen der Joke-Komponente angezeigt werden, deren Frageeigenschaft die angegebene Länge überschreitet?

Source: https://habr.com/ru/post/de436892/


All Articles