In diesem Teil der Übersetzung des React-Schulungskurses empfehlen wir Ihnen, die praktische Aufgabe der Arbeit mit klassenbasierten Komponenten abzuschließen. Danach werden wir beginnen, ein so wichtiges Konzept von React wie den Zustand von Komponenten zu beherrschen.

→
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 KomponentenlebenszyklusTeil 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: KursprojektLektion 25. Workshop. Klassenbasierte Komponenten
→
Original»Job
Unten finden Sie den Code, der in die Datei
index.js
einer Standardanwendung von React
index.js
werden muss, die von
create-react-app
. Konvertieren Sie die in diesem Code enthaltenen Funktionskomponenten in klassenbasierte Komponenten und suchen und beheben Sie außerdem einen kleinen Fehler.
Der Code für die Datei
index.js
:
import React from "react" import ReactDOM from "react-dom"
▍Lösung
Schauen wir uns zunächst an, was die Anwendung in ihrer ursprünglichen Form ausgibt, indem Sie sie in einem Browser öffnen.
Browser-QuellseiteSie können sehen, dass die oberste Zeile auf der Seite nicht richtig aussieht. Nach dem Komma nach Welcome sollte es offensichtlich so etwas wie einen Benutzernamen geben.
Wenn wir den Anwendungscode analysieren, stellt sich heraus, dass die
Header
Komponente diese Zeile anzeigt und erwartet, dass die beim Erstellen ihrer Instanz festgelegte Eigenschaft
username
wird. Eine Instanz dieser Komponente wird in der
App
Komponente erstellt. Nachdem wir dies herausgefunden haben, können wir genau den Fehler korrigieren, der in der Aufgabe erwähnt wurde.
Es ist zu beachten, dass Komponenten normalerweise in verschiedenen Dateien abgelegt werden. In diesem Fall haben wir sie jedoch alle in einer Datei beschrieben.
Wir wandeln die Funktionskomponente der
App
in eine Komponente um, die auf der Klasse basiert. Dazu reicht es aus, den Code in dieses Formular zu bringen:
class App extends React.Component { render() { return ( <div> <Header username="vschool"/> <Greeting /> </div> ) } }
Jetzt steht das Schlüsselwort
class
vor dem Komponentennamen, gefolgt vom
extends React.Component
, nach dem der Hauptteil der Klasse in geschweiften Klammern beschrieben wird. Es sollte eine
render()
-Methode geben, die das zurückgibt, was wir von der Funktionskomponente zurückgegeben haben. Andere Komponenten werden auf die gleiche Weise verarbeitet.
<Header username="vschool"/>
auf die Konstruktion von
<Header username="vschool"/>
. Hier übergeben wir die Eigenschaft
username
mit dem Wert
vschool
Header
Komponente, wodurch der Fehler in der ursprünglichen Anwendung
vschool
wird.
Wie Sie bereits wissen, erwartet die
Header
Komponente, dass die Eigenschaft
username
abgerufen wird, und in der Funktionskomponente wird auf diese Eigenschaft mit dem Konstrukt
props.username
(in diesem Fall ist
props
ein Argument für die Funktion, die die Komponente beschreibt). In klassenbasierten Komponenten sieht dasselbe wie
this.props.username
. Hier ist der neu gestaltete
Header
Komponentencode:
class Header extends React.Component { render() { return ( <header> <p>Welcome, {this.props.username}!</p> </header> ) } }
Die dritte Komponente,
Greeting
, unterscheidet sich geringfügig von den anderen. Tatsache ist, dass darin vor dem
return
einige Berechnungen durchgeführt werden. Bei der Konvertierung in eine Komponente basierend auf einer Klasse müssen diese Berechnungen vor dem Befehl return in die Methode
render()
eingefügt werden. Hier ist der Code für die neu gestaltete
Greeting
:
class Greeting extends Component { render() { const date = new Date() const hours = date.getHours() let timeOfDay if (hours < 12) { timeOfDay = "morning" } else if (hours >= 12 && hours < 17) { timeOfDay = "afternoon" } else { timeOfDay = "night" } return ( <h1>Good {timeOfDay} to you, sir or madam!</h1> ) } }
Beachten Sie, dass diese Komponente in der Deklaration dieser Komponente verwendet wurde:
class Greeting extends Component
. Dies geschieht häufig der Kürze halber, aber damit dies funktioniert, müssen wir den Importbefehl
react
verfeinern und ihn in die folgende Form bringen:
import React, {Component} from "react"
So sieht die Seite der recycelten Anwendung in einem Browser aus.
Überarbeitete Anwendungsseite im BrowserTatsächlich sieht es genauso aus wie die Seite der ursprünglichen Anwendung, und der einzige merkliche Unterschied zwischen diesen Seiten besteht darin, dass der an die
Header
Komponente übergebene Benutzername jetzt in der ersten Zeile angezeigt wird.
Hier ist der vollständige Code für die verarbeitete Datei
index.js
:
import React, {Component} from "react" import ReactDOM from "react-dom"
Wenn die Umsetzung dieser praktischen Aufgabe Ihnen keine Schwierigkeiten bereitet hat - großartig. Wenn Sie mit Komponenten, die auf Klassen basieren, immer noch nicht ganz vertraut sind, nehmen Sie sich Zeit, um mit ihnen zu experimentieren. Beispielsweise können Sie klassenbasierte Komponenten wieder in funktionale Komponenten umwandeln und dann die inverse Transformation durchführen.
Lektion 26. Komponentenstatus
→
OriginalZustand ist ein unglaublich wichtiges Reaktionskonzept. Wenn die Komponente eigene Daten speichern und diese Daten verwalten muss (im Gegensatz zu der Situation, in der die übergeordnete Komponente Daten mithilfe des Eigenschaftsmechanismus an sie überträgt), verwenden Sie den Status der Komponente. Heute betrachten wir die grundlegenden Konzepte bezüglich des Zustands von Komponenten.
Ein Status sind nur die Daten, die die Komponente steuert. Dies bedeutet insbesondere, dass die Komponente diese Daten ändern kann. Gleichzeitig können die uns bereits bekannten Eigenschaften, die die Komponente von der übergeordneten Komponente erhält, von der empfangenden Komponente nicht geändert werden. Sie sind laut React-
Dokumentation unveränderlich (unveränderlich). Wenn wir beispielsweise in einer auf einer Klasse basierenden Komponente versuchen, ein Konstrukt wie
this.props.name = "NoName"
, wird eine Fehlermeldung
this.props.name = "NoName"
.
Es sollte beachtet werden, dass, wenn eine Komponente mit state arbeiten muss, es sich um eine Komponente handeln sollte, die auf der Klasse basiert. Lassen Sie uns darüber sprechen, wie Sie die Komponente mit state ausstatten, indem Sie mit dem folgenden Codefragment beginnen, das den Inhalt der Datei
App.js
eines Standardprojekts enthält, das von
create-react-app
:
import React from "react" class App extends React.Component { render() { return ( <div> <h1>Is state important to know?</h1> </div> ) } } export default App
So sieht die Anwendungsseite in einem Browser aus.
Anwendungsseite im BrowserUm eine Komponente mit state auszustatten, müssen Sie zunächst einen Klassenkonstruktor erstellen. Es sieht aus wie eine
constructor()
-Klassenmethode. Danach sieht der Komponentencode folgendermaßen aus:
class App extends React.Component { constructor() { } render() { return ( <div> <h1>Is state important to know?</h1> </div> ) } } Constructor()
Dies ist eine spezielle in JavaScript integrierte Methode, mit der Objekte basierend auf Klassen erstellt und initialisiert werden können. Wenn Sie beim Erstellen eines Objekts etwas initialisieren müssen, werden die entsprechenden Operationen genau in der Methode
constructor()
.
Das erste, was Sie im Konstruktorcode tun müssen, ist, den Konstruktor der übergeordneten Klasse aufzurufen. Dies erfolgt mit der Funktion
super()
. Im Konstruktor der übergeordneten Klasse können bestimmte Initialisierungsoperationen ausgeführt werden, deren Ergebnisse für unser Objekt nützlich sind. So sieht unser Klassenkonstruktor jetzt aus:
constructor() { super() }
Um die Komponente mit state auszustatten, müssen wir im Konstruktor die class -Eigenschaft zur Klasseninstanz hinzufügen. Diese Eigenschaft ist ein Objekt:
constructor() { super() this.state = {} }
Hier haben wir es mit einem leeren Objekt initialisiert. Mit dem Konstrukt
this.state
können Sie mit dem Status im Komponentencode
this.state
. Fügen Sie dem Status eine neue Eigenschaft hinzu:
constructor() { super() this.state = { answer: "Yes" } }
Lassen Sie uns nun darüber nachdenken, wie Sie das verwenden, was im Code im Status gespeichert ist. Denken Sie daran, dass die Komponente die Frage anzeigt.
Is state important to know?
. Der Staat speichert die Antwort auf diese Frage. Um diese Antwort nach der Frage hinzuzufügen, müssen Sie dasselbe tun, wie wir es normalerweise tun, indem Sie dem JSX-Code JavaScript-Konstrukte hinzufügen.
{this.state.answer}
nämlich das Konstrukt
{this.state.answer}
am Ende der Zeile hinzu. Infolgedessen sieht der vollständige Komponentencode folgendermaßen aus:
class App extends React.Component { constructor() { super() this.state = { answer: "Yes" } } render() { return ( <div> <h1>Is state important to know? {this.state.answer}</h1> </div> ) } }
Und so sieht die Anwendungsseite im Browser aus.
Anwendungsseite im BrowserAn dieser Stelle möchte ich darauf hinweisen, dass der Status, den die Komponente während der Initialisierung erhält, während des Betriebs der Komponente geändert werden kann. Darüber hinaus können Komponenten mithilfe des Mechanismus zum Arbeiten mit bereits bekannten Eigenschaften den Status an untergeordnete Komponenten übergeben. Wenn wir in unserem Fall beispielsweise davon ausgehen, dass es eine bestimmte Komponente von
ChildComponent
, können Daten aus dem Status folgendermaßen an sie übertragen werden:
<ChildComponent answer={this.state.answer}/>
Wir werden zwar nicht im Detail darüber sprechen, wie die im Status der Komponente gespeicherten Daten geändert werden können. Wir stellen nur fest, dass beim Aufrufen der
setState()
-Methode, mit der dieses Problem gelöst wird, nicht nur der Status der Komponente geändert wird, sondern auch die
setState()
, die über den Eigenschaftsmechanismus an die untergeordneten Komponenten übertragen werden, aktualisiert werden. Wenn Sie den Status ändern, ändern sich außerdem die Daten aus dem auf der Anwendungsseite angezeigten Status automatisch.
Zusammenfassung
Heute hatten Sie die Möglichkeit, mit klassenbasierten Komponenten zu arbeiten. Darüber hinaus begann hier Ihre Einführung in das Konzept des Komponentenstatus. Das nächste Mal finden Sie praktische Aufgaben für die Arbeit mit dem Staat.
Liebe Leser! Wenn Sie React in der Praxis verwenden, teilen Sie uns bitte mit, wie Sie den Status von Komponenten verwalten. Verwenden Sie Standard-React-Tools oder etwas anderes?
