Diese Antwort soll genügend Informationen liefern, um den Status nicht direkt in React zu ändern / zu mutieren.
Die Reaktion folgt dem unidirektionalen Datenfluss . Das heißt, der Datenfluss innerhalb der Reaktion sollte und wird voraussichtlich auf einer Kreisbahn liegen.
Datenfluss der Reaktion ohne Fluss

Damit React so funktioniert, haben Entwickler das React der funktionalen Programmierung ähnlich gemacht . Die Faustregel der funktionalen Programmierung ist Unveränderlichkeit . Lassen Sie es mich klar und deutlich erklären.
Wie funktioniert der unidirektionale Fluss?
states sind ein Datenspeicher, der die Daten einer Komponente enthält.
- Das
viewRendern einer Komponente basiert auf dem Status.
- Wenn
viewetwas auf dem Bildschirm geändert werden muss, sollte dieser Wert vom bereitgestellt werden store.
- Um dies zu erreichen, bietet React eine
setState()Funktion, die einen objectneuen Status aufnimmt statesund object.assign()den vorherigen Status vergleicht und zusammenführt (ähnlich ) und den neuen Status zum Statusdatenspeicher hinzufügt.
- Wenn sich die Daten im Statusspeicher ändern, wird durch Reagieren ein erneutes Rendern mit dem neuen Status ausgelöst, den der
viewBenutzer verbraucht, und auf dem Bildschirm angezeigt.
Dieser Zyklus wird während der gesamten Lebensdauer der Komponente fortgesetzt.
Wenn Sie die obigen Schritte sehen, zeigt dies deutlich, dass beim Ändern des Status viele Dinge dahinter stehen. Wenn Sie also den Status direkt mutieren und setState()mit einem leeren Objekt aufrufen . Das previous statewird mit Ihrer Mutation verschmutzt. Aufgrund dessen wird der flache Vergleich und die Zusammenführung von zwei Zuständen gestört oder wird nicht stattfinden, da Sie jetzt nur einen Zustand haben. Dies stört alle Lebenszyklusmethoden der Reaktion.
Infolgedessen verhält sich Ihre App abnormal oder stürzt sogar ab. In den meisten Fällen hat dies keine Auswirkungen auf Ihre App, da alle Apps, die wir zum Testen verwenden, ziemlich klein sind.
Ein weiterer Nachteil der Mutation von Objectsund Arraysin JavaScript besteht darin, dass Sie beim Zuweisen eines Objekts oder eines Arrays nur eine Referenz auf dieses Objekt oder dieses Array erstellen. Wenn Sie sie mutieren, sind alle Verweise auf dieses Objekt oder dieses Array betroffen. React behandelt dies auf intelligente Weise im Hintergrund und gibt uns einfach eine API, damit es funktioniert.
Die häufigsten Fehler bei der Behandlung von Zuständen in React
this.state = {
a: [1,2,3,4,5]
}
const b = this.state.a.push(6)
this.setState({
a: b
})
Im obigen Beispiel this.state.a.push(6)wird der Status direkt mutiert. Das Zuweisen zu einer anderen Variablen und das Aufrufen entspricht setStatedem unten gezeigten. Da wir den Status ohnehin mutiert haben, macht es keinen Sinn, ihn einer anderen Variablen zuzuweisen und setStatemit dieser Variablen aufzurufen .
this.state.a.push(6)
this.setState({})
Die meisten Leute machen das. Das ist so falsch . Dies bricht die Schönheit von React und macht Sie zu einem schlechten Programmierer.
Was ist der beste Weg, um mit Zuständen in React umzugehen? Lassen Sie mich erklären.
Wenn Sie "etwas" im vorhandenen Status ändern müssen, erhalten Sie zuerst eine Kopie dieses "etwas" aus dem aktuellen Status.
this.state = {
a: [1,2,3,4,5]
}
const currentStateCopy = [...this.state.a]
Durch Mutieren currentStateCopywird der ursprüngliche Zustand nicht mutiert. Führen Sie Operationen aus currentStateCopyund setzen Sie sie mit auf den neuen Status setState().
currentStateCopy.push(6)
this.state({
a: currentStateCopy
})
Das ist wunderschön, oder?
Auf diese Weise werden alle Referenzen von this.state.aerst betroffen, wenn wir sie verwenden setState. Dies gibt Ihnen die Kontrolle über Ihren Code und hilft Ihnen dabei, elegante Tests zu schreiben und sich auf die Leistung des Codes in der Produktion zu verlassen.
Zur Beantwortung Ihrer Frage,
Warum kann ich den Status einer Komponente nicht direkt ändern?
Ja, das kannst du . Sie müssen sich jedoch den folgenden Konsequenzen stellen.
- Wenn Sie skalieren, schreiben Sie nicht verwaltbaren Code.
- Sie verlieren die Kontrolle
stateüber alle Komponenten.
- Anstatt React zu verwenden, schreiben Sie benutzerdefinierte Codes über React.
Unveränderlichkeit ist nicht erforderlich, da JavaScript Single-Threaded ist. Aber es ist eine gute Übung, die Ihnen auf lange Sicht helfen wird.
PS. Ich habe ungefähr 10000 Zeilen veränderbaren React JS-Codes geschrieben. Wenn es jetzt kaputt geht, weiß ich nicht, wo ich suchen soll, da alle Werte irgendwo mutiert sind. Als ich das merkte, fing ich an, unveränderlichen Code zu schreiben. Vertrau mir! Das ist das Beste, was Sie mit einem Produkt oder einer App tun können.
Hoffe das hilft!
setStateDokumentation . Es behandelt einige der guten Gründe.