Aktualisieren eines Objekts mit setState in React
Ist es überhaupt möglich, Objekt's Eigenschaften mit setState zu aktualisieren?
Etwa so:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Ich habe es versucht:
this.setState({jasper.name: 'someOtherName'});
und dies:
this.setState({jasper: {name: 'someothername'}})
Das erste führt zu einem Syntaxfehler und das zweite bewirkt einfach nichts. Irgendwelche Ideen?
211
3
Es gibt mehrere Möglichkeiten, dies zu tun, da die Zustandsaktualisierung eine asynchrone Operation ist. Um das Zustandsobjekt zu aktualisieren, müssen wir die Updater-Funktion mit "setState" verwenden.
1- Die einfachste Variante:
Erstelle zuerst eine Kopie von
jasper
und führe dann die Änderungen in dieser Kopie durch:Anstatt
Object.assign
zu verwenden, können wir es auch so schreiben:2- Verwendung des [Spreizungsoperators]3:
Hinweis:
Object.assign
undSpread Operator
erzeugen nur eine oberflächliche Kopie, wenn Sie also ein verschachteltes Objekt oder ein Array von Objekten definiert haben, benötigen Sie einen anderen Ansatz.Aktualisieren eines verschachtelten Zustandsobjekts:
Angenommen, Sie haben state als definiert:
Um extraCheese des Pizza-Objekts zu aktualisieren:
Array von Objekten aktualisieren:
Nehmen wir an, Sie haben eine ToDo-App, und Sie verwalten die Daten in diesem Formular:
Um den Status eines ToDo-Objekts zu aktualisieren, führen Sie eine Map auf dem Array aus und prüfen Sie auf einen eindeutigen Wert für jedes Objekt. Im Falle von
condition=true
geben Sie das neue Objekt mit dem aktualisierten Wert zurück, andernfalls dasselbe Objekt.Vorschlag: Wenn das Objekt keinen eindeutigen Wert hat, verwenden Sie den Array-Index.
Im ersten Fall handelt es sich tatsächlich um einen Syntaxfehler.
Da ich den Rest Ihrer Komponente nicht sehen kann, ist es schwer zu erkennen, warum Sie hier Objekte in Ihrem Zustand verschachteln. Es ist keine gute Idee, Objekte im Komponentenzustand zu verschachteln. Versuchen Sie, Ihren Ausgangszustand zu setzen:
So können Sie, wenn Sie den Namen aktualisieren wollen, einfach aufrufen:
Erreicht man damit das, was man anstrebt?
Für größere, komplexere Datenspeicher würde ich etwas wie Redux verwenden. Aber das ist viel fortgeschrittener.
Die allgemeine Regel mit Komponente Zustand ist es nur zu verwenden, um UI-Status der Komponente zu verwalten (z. B. aktiv, Timer, etc.)
Schauen Sie sich diese Referenzen an:
Eine andere Möglichkeit: Definieren Sie Ihre Variable aus dem Jasper-Objekt heraus und rufen Sie dann einfach eine Variable auf.
Spread-Operator: ES6