React Tutorial Teil 18: Die sechste Phase der Arbeit an einer TODO-Anwendung

Im heutigen Teil der Übersetzung des React-Lernprogramms können Sie weiter an der Todo-Anwendung arbeiten und sicherstellen, dass das Klicken auf die Flags den Status der Komponente beeinflusst.

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 33. Workshop. TODO-Anwendung. Etappe Nummer 6


Original

»Job


In dieser praktischen Lektion werden wir weiter an der Todo-Anwendung arbeiten und sicherstellen, dass Benutzeraktionen den Status der Komponente beeinflussen. Es geht darum, es uns zu ermöglichen, die Elemente auf der Aufgabenliste als erledigt oder nicht erledigt zu markieren. Im Folgenden finden Sie den Code der App Komponente sowie einige der verfügbaren Werkstücke und Kommentare, die Sie bei der Ausführung der Aufgabe unterstützen sollen. Hier ist, wozu Sie heute eingeladen sind:

  1. Erstellen Sie in der App Komponente einen Ereignishandler, der auf Flag-Änderungen reagiert (es handelt sich um das Ereignis onChange ), und ändert den Status der Anwendung entsprechend. Vielleicht ist dies der schwierigste Teil der heutigen Aufgabe. Um damit fertig zu werden, achten Sie auf die Kommentare und Leerzeichen im Code.
  2. TodoItem die entsprechende Methode an die TodoItem Komponente.
  3. TodoItem in der TodoItem Komponente einen Mechanismus, der beim onChange des onChange Ereignisses die an die Komponenteninstanz übergebene Methode aufruft und ihr die onChange ( id ) übergibt, die dem Flag entspricht, auf das der Benutzer geklickt hat.

Hier ist der Code für die App Komponente:

 import React from "react" import TodoItem from "./TodoItem" import todosData from "./todosData" class App extends React.Component {   constructor() {       super()       this.state = {           todos: todosData       }       this.handleChange = this.handleChange.bind(this)   }     handleChange(id) {       //   ,      id        // completed   c false  true ( ).       //   ,       .       //       ,  .       // (  ,       map.)   }     render() {       const todoItems = this.state.todos.map(item => <TodoItem key={item.id} item={item}/>)             return (           <div className="todo-list">               {todoItems}           </div>       )   } } export default App 

▍Lösung


Erstellen Sie zunächst einen einfachen Mechanismus zum Überprüfen des Aufrufs der handleChange() -Methode. Wir bringen es nämlich in diese Form:

 handleChange(id) {   console.log("Changed", id) } 

Jetzt implementieren wir, was gemäß den Absätzen 2 und 3 der Aufgabe zu tun ist. Das heißt, wir stellen eine Verbindung zwischen dem Klicken auf das Flag und dem Aufrufen der handleChange() -Methode her, indem handleChange() die id dieses Flags an dieses übergeben.

Um einen Verweis auf handleChange() an eine Instanz der TodoItem Komponente zu übergeben, können Sie das Gleiche tun, indem Sie Eigenschaften an diese übergeben und den Code zum Erstellen der Liste der Komponenten wie TodoItem neu schreiben:

 const todoItems = this.state.todos.map(item => <TodoItem key={item.id} item={item} handleChange={this.handleChange}/>) 

Beachten Sie, dass die handleChange Eigenschaft, die TodoItem Komponenten zur Verfügung TodoItem , einen Verweis auf die handleChange Methode der Instanz der App Komponente enthält. In der TodoItem Komponente kann auf diese Methode auf dieselbe Weise zugegriffen werden wie auf andere an sie übergebene Eigenschaften. Zu diesem Zeitpunkt sieht der TodoItem Code folgendermaßen aus:

 import React from "react" function TodoItem(props) {   return (       <div className="todo-item">           <input               type="checkbox"               checked={props.item.completed}               onChange={() => console.log("Changed!")}           />           <p>{props.item.text}</p>       </div>   ) } export default TodoItem 

Um die handleChange Methode im Komponentencode handleChange , können Sie ein Konstrukt der Form props.handleChange() . In diesem Fall muss diese Methode die id Elements übergeben. Der onChange Ereignishandler akzeptiert ein Ereignisobjekt. Wir brauchen dieses Objekt nicht, um die handleChange() -Methode handleChange() . Wir schreiben den Code, in dem wir dem Element den onChange Ereignishandler zuweisen, wie folgt um:

 onChange={(event) => props.handleChange(props.item.id)} 

Hier rufen wir die handleChange() -Methode auf und übergeben ihr den Elementbezeichner aus den an sie übergebenen Eigenschaften einer anderen Funktion, die das Ereignisobjekt akzeptiert. Da wir dieses Objekt hier nicht verwenden, kann der Code folgendermaßen umgeschrieben werden:

 onChange={() => props.handleChange(props.item.id)} 

Versuchen Sie nun, die Anwendung auszuführen, und klicken Sie beim Öffnen der Konsole auf die Kontrollkästchen.


Testen der handleChange () -Methode

Nachrichten mit Bezeichnern von Flags, mit denen wir auf klicken, gelangen zur Konsole. Die Flags ändern jedoch noch nicht das Erscheinungsbild, da die handleChange() -Methode handleChange() keinen Mechanismus zum Ändern des Status einer Komponente implementiert handleChange() . Infolgedessen haben wir uns gerade mit dem zweiten und dritten Teil des Auftrags befasst, und jetzt können wir beginnen, an seinem ersten, vielleicht interessantesten Teil, in Bezug auf die Arbeit mit dem Staat zu arbeiten.

Zunächst müssen wir das Problem bezüglich des Status lösen, in dem ein Array in einem Status gespeichert ist, dessen Element als Reaktion auf einen Klick auf ein Flag geändert werden muss. Wir sollten jedoch das in der alten Version des Status gespeicherte Array nicht ändern. Das heißt, Sie können beispielsweise nicht einfach durch ein Array von Objekten gehen, die sich bereits in einem Status befinden, das erforderliche Element finden und dessen completed Eigenschaft ändern. Wir brauchen, dass nach dem Ändern des Zustands ein neues Array gebildet wird, von dem eines der Elemente geändert wird und der Rest derselbe bleibt wie zuvor. Einer der Ansätze zur Bildung eines solchen Arrays ist die Verwendung der Array-Methode map() , die in den Kommentaren zur Aufgabe erwähnt wird. Wir werden den Code in der setState() -Methode schreiben. Lassen Sie uns handleChange() Code der handleChange() -Methode aus der App Komponente in das folgende Formular bringen:

 handleChange(id) {   this.setState(prevState => {         }) } 

Mit der map() -Methode prevState.todos wir nun das Array prevState.todos und suchen nach dem Element, das wir darin benötigen, prevState.todos dem Element, dessen id an die handleChange() -Methode übergeben wird, und ändern dann die completed Eigenschaft. Die map() -Methode gibt ein neues Array zurück, das im neuen Status der Anwendung verwendet wird. Daher schreiben wir dieses Array in eine Konstante. So sieht es aus:

 handleChange(id) {   this.setState(prevState => {       const updatedTodos = prevState.todos.map(todo => {           if (todo.id === id) {               todo.completed = !todo.completed           }           return todo       })       return {           todos: updatedTodos       }   }) } 

Wenn hier während der Verarbeitung des Arrays mit map() ein Element handleChange() , dessen id gleich der an die handleChange() -Methode übergebenen handleChange() ist, wird der Wert der completed Eigenschaft dieses Elements umgekehrt ( true bis false und umgekehrt). Danach gibt map() unabhängig davon, ob das Element geändert wurde, dieses Element zurück. Es fällt in ein neues Array (hier dargestellt durch die updatedTodos Konstante) unter demselben Index, unter dem sich das entsprechende Element aus der vorherigen Version des Status im todos Array befand. Nachdem das gesamte Array gescannt und das Array updatedTodos vollständig gebildet wurde, wird dieses Array als Wert der Eigenschaft todos des Objekts verwendet, das von der Methode setState() wird, bei der es sich um eine neue Version des Status handelt.

Wenn Sie die Anwendung jetzt starten, stellen Sie möglicherweise fest, dass die Flags auf unsere Effekte reagieren. Dies deutet darauf hin, dass durch Klicken auf sie der Status der Anwendung geändert wird. Anschließend werden sie mit neuen Daten neu gerendert.

Zusammenfassung


Heute hatten wir beim Schreiben eine funktionierende Todo-Anwendung zur Verfügung, bei der wir viele der von uns untersuchten React-Konzepte verwendeten. Tatsächlich ist es immer noch durchaus möglich, es zu verfeinern, insbesondere zu stilisieren und seine Fähigkeiten zu erweitern. Wir werden in einer der folgenden Klassen zu ihm zurückkehren.

Liebe Leser! Haben Sie die heutige praktische Arbeit gemeistert?

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


All Articles