Im heutigen Teil der Ăbersetzung des React-Kurses empfehlen wir Ihnen, die nĂ€chste praktische Aufgabe abzuschlieĂen und Ihrer Aufmerksamkeit eine Geschichte darĂŒber zu prĂ€sentieren, wie Sie den Status von React-Komponenten Ă€ndern können.

â
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 31. Workshop. TODO-Anwendung. Etappe Nummer 5
â
Original»Job
Beim Starten unserer Todo-Anwendung stellen Sie möglicherweise fest, dass in der Konsole eine Benachrichtigung angezeigt wird, die angibt, dass wir nach der Konfiguration der
checked
Eigenschaft eines Elements in der
TodoItem
Komponente keinen Mechanismus fĂŒr die Interaktion mit diesem Element in Form eines
onChange
Ereignishandlers
onChange
. Wenn Sie mit der AnwendungsoberflĂ€che arbeiten, fĂŒhrt dies dazu, dass die auf der Seite angezeigten Flags nicht aktiviert oder deaktiviert werden können.
Hier werden Sie aufgefordert, ein Element des
checkbox
der
TodoItem
Komponente mit einem
TodoItem
Ereignishandler
TodoItem
, der in dieser Arbeitsphase ausreicht, um in Form einer Funktion dargestellt zu werden, die etwas an die Konsole ausgibt.
âLösung
So sieht der
TodoItem
Komponentencode jetzt aus, der in der Datei
TodoItem.js
gespeichert ist:
import React from "react" function TodoItem(props) { return ( <div className="todo-item"> <input type="checkbox" checked={props.item.completed}/> <p>{props.item.text}</p> </div> ) } export default TodoItem
Dies wird auf der Konsole angezeigt, wenn die Anwendung gestartet wird.
KonsolenbenachrichtigungGleichzeitig reagieren die Flags nicht auf unsere Effekte.
Um diese Benachrichtigung zu
onChange
und das Projekt fĂŒr die weitere Arbeit vorzubereiten, reicht es aus, dem
checkbox
einen
onChange
Ereignishandler zuzuweisen. So sieht es im Code 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
Hier verwenden wir als Handler eine einfache Funktion, die das Wort
Checked!
an die Konsole ausgibt
Checked!
. Gleichzeitig fĂŒhrt das Klicken auf die Flags nicht zu einer Ănderung ihres Status, aber die Benachrichtigung von der Konsole, wie in der folgenden Abbildung dargestellt, verschwindet.
Flags funktionieren immer noch nicht, aber die Benachrichtigung von der Konsole ist verschwundenDiese kleine Ănderung an der Anwendung ermöglicht es uns, nachdem wir uns mit der Ănderung des Status der Komponenten befasst haben, die KontrollkĂ€stchen ordnungsgemÀà zu aktivieren.
Lektion 32. Ăndern des Status von Komponenten
â
OriginalBeginnen wir mit einer Standardanwendung, die mit
create-react-app
in der Datei
App.js
erstellt wurde und den folgenden Code enthÀlt:
import React from "react" class App extends React.Component { constructor() { super() this.state = { count: 0 } } render() { return ( <div> <h1>{this.state.count}</h1> <button>Change!</button> </div> ) } } export default App
Die
index.css
styles, die in der Datei
index.js
enthalten ist, enthÀlt die folgende Beschreibung der Stile:
div { display: flex; flex-direction: column; align-items: center; justify-content: center; } h1 { font-size: 3em; } button { border: 1px solid lightgray; background-color: transparent; padding: 10px; border-radius: 4px; } button:hover { cursor: pointer; } button:focus { outline:0; }
Zu diesem Zeitpunkt sieht die Anwendung wie in der folgenden Abbildung dargestellt aus.
Anwendungsseite im BrowserHeute werden wir darĂŒber sprechen, wie der Zustand von Komponenten geĂ€ndert werden kann. Wenn die Komponente einen Status hat, können durch Initialisieren einige Daten darin gespeichert werden. Wenn der Status jedoch nicht geĂ€ndert werden könnte, wĂŒrde die Komponente von ihrem Vorhandensein nicht besonders profitieren. Die Speicherung der darin enthaltenen Daten wĂŒrde sich nicht wesentlich von beispielsweise dem harten Kopieren im Komponentencode unterscheiden.
Lassen Sie uns ĂŒber die Anwendung sprechen, an deren Beispiel wir mit dem Status der Komponente arbeiten werden. Die
App
Komponente, deren Code oben dargestellt ist, ist eine klassenbasierte Komponente. Dies ist ziemlich offensichtlich, da wir diese Komponente benötigen, um einen Zustand zu haben. Im Komponentencode verwenden wir den Konstruktor.
Darin rufen wir wie immer die Methode
super()
und initialisieren den Status, indem wir die Eigenschaft
count
schreiben und ihm den Anfangswert
0
zuweisen. In der
render()
-Methode drucken wir einen Header der ersten Ebene, der den Wert der
count
Eigenschaft aus dem Status der Komponente darstellt, sowie eine SchaltflÀche mit dem Wort
Change!
. All dies wird mit Stilen formatiert.
Wenn Sie in dieser Phase der Arbeit an der Anwendung diese in einem Browser öffnen und auf die SchaltflĂ€che klicken, geschieht natĂŒrlich nichts. Wir mĂŒssen jedoch auf die SchaltflĂ€che klicken, um den Status der Komponente zu Ă€ndern, was sich auf ihre
count
Eigenschaft auswirkt. Gleichzeitig haben wir bereits die Methode zur Behandlung von Ereignissen in React untersucht. Unsere Aufgabe besteht darin, einen Mechanismus zu erstellen, der bei einem Klick auf eine SchaltflÀche die Zustandseigenschaft von
count
Ă€ndert.
onClick
wir zur Lösung unseres Problems, indem wir die SchaltflÀche mit einem
onClick
Ereignishandler
onClick
, der zunÀchst einfach etwas an die Konsole ausgibt.
Zu diesem Zweck fĂŒgen wir der Komponentenklasse eine neue Methode hinzu. Sie können es beliebig nennen, aber es ist ĂŒblich, solche Methoden aufzurufen, damit ihre Namen die Ereignisse anzeigen, die sie verarbeiten. Daher nennen wir es
handleClick()
, da wir es zum Verarbeiten des
handleClick()
. So sieht nun der
App
Komponentencode aus.
import React from "react" class App extends React.Component { constructor() { super() this.state = { count: 0 } } handleClick() { console.log("I'm working!") } render() { return ( <div> <h1>{this.state.count}</h1> <button onClick={this.handleClick}>Change!</button> </div> ) } } export default App
Bitte beachten Sie, dass wir unter Bezugnahme auf diese Methode aus
render()
eine Konstruktion der Form
this.handleClick
.
Wenn Sie nun auf die SchaltflÀche klicken, wird die entsprechende Meldung in der Konsole angezeigt.
Durch Klicken auf die SchaltflĂ€che wird die Klassenmethode aufgerufen.Machen wir es jetzt so, dass durch Klicken auf die SchaltflĂ€che die darĂŒber angezeigte Zahl erhöht wird, dh der Status der Komponente geĂ€ndert wird. Versuchen Sie vielleicht, den Status der Komponente direkt in der
handleClick()
-Methode zu
handleClick()
? Nehmen wir an, wenn wir diese Methode wie folgt umschreiben:
handleClick() { this.state.count++ }
Ich muss sofort sagen, dass dies mit dem Status der Komponenten in React nicht funktioniert. Der Versuch, einen solchen Code auszufĂŒhren, fĂŒhrt zu einem Fehler.
Der Zustand der Komponente kann mit der Kleidung verglichen werden, die eine Person trÀgt. Wenn er sich umziehen möchte, Àndert oder streicht er die Kleidung nicht neu, ohne sich auszuziehen, sondern zieht sie aus und zieht etwas anderes an. Genau genommen arbeiten sie genau so mit dem Zustand der Komponenten.
Sie erinnern sich vielleicht, dass wir ĂŒber eine spezielle Methode zum Ăndern des Status gesprochen haben, die in Komponenten basierend auf Klassen verfĂŒgbar ist, da sie die
React.Component
Klasse erweitern. Dies ist die
setState()
-Methode. Es wird in FĂ€llen verwendet, in denen Sie den Status einer Komponente Ă€ndern mĂŒssen. Diese Methode kann auf verschiedene Arten verwendet werden.
Denken Sie daran, dass ein Zustand ein Objekt ist. Versuchen
setState()
, ein Objekt an die
setState()
-Methode zu ĂŒbergeben, das den Status ersetzt. Wir schreiben die
handleClick()
-Methode folgendermaĂen um:
handleClick() { this.setState({ count: 1 }) }
Der Versuch, diese Methode zu verwenden, fĂŒhrt zu folgendem Fehler:
TypeError: Cannot read property 'setState' of undefined
. TatsĂ€chlich wird das, worĂŒber wir jetzt sprechen, unter den React-Entwicklern sehr kontrovers diskutiert, und jetzt werde ich Ihnen einen sehr einfachen Weg zeigen, um dieses Problem zu lösen, was auf den ersten Blick ungewöhnlich erscheinen mag.
Der Punkt ist, dass jedes Mal, wenn eine
handleClick()
in unserem Fall
handleClick()
) erstellt wird, in der die Methode
setState()
verwendet werden soll, diese Methode dieser zugeordnet werden muss. Dies erfolgt im Konstruktor. Der Komponentencode nach dieser Ănderung sieht folgendermaĂen aus:
import React from "react" class App extends React.Component { constructor() { super() this.state = { count: 0 } this.handleClick = this.handleClick.bind(this) } handleClick() { this.setState({ count: 1 }) } render() { return ( <div> <h1>{this.state.count}</h1> <button onClick={this.handleClick}>Change!</button> </div> ) } } export default App
Jetzt nach dem Klicken auf die SchaltflÀche
Change!
Nummer 1 wird darĂŒber angezeigt, Fehlermeldungen werden nicht angezeigt.
Durch DrĂŒcken einer Taste wird der Status geĂ€ndertEs stimmt, die SchaltflĂ€che hat sich als "einmalig" herausgestellt. Nach dem ersten Klicken Ă€ndert sich
0
in
1
, und wenn Sie erneut darauf klicken, geschieht nichts. Im Allgemeinen ist dies nicht ĂŒberraschend. Der Code, der beim Klicken auf die SchaltflĂ€che aufgerufen wird, erfĂŒllt seine Aufgabe und Ă€ndert jedes Mal den Status in einen neuen. Nach dem ersten Klicken auf die SchaltflĂ€che unterscheidet sich der neue Status, in dem die Nummer
1
in der Eigenschaft
count
gespeichert ist, jedoch nicht vom alten. Um dieses Problem zu lösen, sollten Sie eine andere Möglichkeit in Betracht ziehen, mit der
setState()
-Methode zu arbeiten.
Wenn wir nicht daran interessiert sind, wie der vorherige Status der Komponente war, können wir einfach ein Objekt an diese Methode ĂŒbergeben, das den Status ersetzt. Es kommt jedoch hĂ€ufig vor, dass der neue Status einer Komponente vom alten abhĂ€ngt. In unserem Fall bedeutet dies, dass wir basierend auf dem Wert der
count
Eigenschaft, die in der vorherigen Version des Status gespeichert ist, 1 zu diesem Wert hinzufĂŒgen möchten. In FĂ€llen, in denen Sie den Status Ă€ndern mĂŒssen, mĂŒssen Sie wissen, was zuvor darin gespeichert war. Sie können der Methode
setState()
eine Funktion ĂŒbergeben, die als Parameter die vorherige Version des Status empfĂ€ngt. Sie können diesen Parameter beliebig
prevState
, in unserem Fall ist es
prevState
. Die Beschaffung dieser Funktion sieht folgendermaĂen aus:
handleClick() { this.setState(prevState => { }) }
Sie könnten denken, dass es in einer solchen Funktion ausreicht, sich einfach mit einer Konstruktion der Form
this.state
auf den Zustand zu beziehen, aber dieser Ansatz passt nicht zu uns. Daher ist es wichtig, dass diese Funktion die vorherige Version des Komponentenstatus akzeptiert.
Die Funktion sollte eine neue Version des Status zurĂŒckgeben. So
handleClick()
die
handleClick()
-Methode aus,
handleClick()
dieses Problem zu
handleClick()
:
handleClick() { this.setState(prevState => { return { count: prevState.count + 1 } }) }
Beachten Sie, dass wir das Konstrukt
count: prevState.count + 1
verwenden, um den neuen Wert der Eigenschaft
count: prevState.count + 1
. Sie könnten denken, dass eine Konstruktion des Formulars
count: prevState.count++
, aber der Operator
++
count: prevState.count++
Variable, auf die er angewendet wird. Dies bedeutet einen Versuch, die vorherige Version des Status zu Àndern, sodass wir sie hier nicht verwenden.
Der vollstĂ€ndige Code der Komponentendatei sieht zu diesem Zeitpunkt folgendermaĂen aus:
import React from "react" class App extends React.Component { constructor() { super() this.state = { count: 0 } this.handleClick = this.handleClick.bind(this) } handleClick() { this.setState(prevState => { return { count: prevState.count + 1 } }) } render() { return ( <div> <h1>{this.state.count}</h1> <button onClick={this.handleClick}>Change!</button> </div> ) } } export default App
Jetzt erhöht jeder Klick auf die SchaltflÀche den ZÀhlerwert.
Jeder Klick auf die SchaltflĂ€che erhöht den ZĂ€hlerwert.Was wir gerade herausgefunden haben, eröffnet uns groĂe Möglichkeiten bei der Entwicklung von React-Anwendungen.
Wir haben bereits gesagt, dass eine ĂŒbergeordnete Komponente ĂŒber einen Eigenschaftsmechanismus Eigenschaften aus ihrem eigenen Status an untergeordnete Komponenten ĂŒbergeben kann. Wenn React eine Ănderung des Status der ĂŒbergeordneten Komponente feststellt, wird die untergeordnete Komponente, an die dieser Status ĂŒbergeben wird, erneut gerendert. Es sieht aus wie ein Aufruf der
render()
-Methode. Infolgedessen spiegelt die untergeordnete Komponente die neuen Daten wider, die im Status der ĂŒbergeordneten Komponente gespeichert sind.
Zusammenfassung
Heute haben Sie die Todo-Anwendung fĂŒr die weitere Arbeit vorbereitet und sich mit den Mechanismen vertraut gemacht, die in React zum Ăndern des Status einer Komponente verwendet werden. Beim nĂ€chsten Mal werden Sie aufgefordert, die Funktionen der Trainingsanwendung anhand der heute erlernten Informationen zu erweitern.
Liebe Leser! Wie beurteilen Sie die Tatsache, dass der Status von Komponenten in React ohne spezielle Mechanismen nicht direkt geÀndert werden kann?
