this.setState führt Zustände nicht wie erwartet zusammen
Habe ich den folgenden Status:
this.setState({ selected: { id: 1, name: 'Foobar' } });
Dann update ich den Status:
this.setState({ selected: { name: 'Barfoo' }});
Da setState wird angenommen, merge ich es erwarten würde:
{ selected: { id: 1, name: 'Barfoo' } };
Sondern es frisst die id und der Status ist:
{ selected: { name: 'Barfoo' } };
Ist das erwartete Verhalten und was ist die Lösung zum aktualisieren nur eine Eigenschaft einer geschachtelten Zustand Objekt?
InformationsquelleAutor der Frage Pickels | 2013-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke
setState()
nicht rekursiv merge.Können Sie den Wert verwenden, der den aktuellen Stand
this.state.selected
Aufbau eines neuen Staates und rufen Sie dannsetState()
:Ich verwendet habe, die Funktion
_.extend()
- Funktion (aus underscore.js Bibliothek) hier, um zu verhindern, dass änderungen an bestehendenselected
Teil des Staates durch die Schaffung einer flachen Kopie.Andere Lösung wäre, zu schreiben
setStateRecursively()
die nicht rekursive merge auf einen neuen Status und ruft dannreplaceState()
:InformationsquelleAutor der Antwort andreypopp
Unveränderlichkeit Helfer wurden vor kurzem Hinzugefügt, um zu Reagieren.addons, so dass Sie nun so etwas wie:
Unveränderlichkeit Helfer-Dokumentation:
http://facebook.github.io/react/docs/update.html
InformationsquelleAutor der Antwort user3874611
Da viele der Antworten verwenden, den aktuellen Stand als Grundlage für die Zusammenführung in den neuen Daten, ich wollte darauf hinweisen, dass diese brechen können. Status-änderungen werden in eine Warteschlange gestellt und nicht sofort zu ändern, die für die Komponente ein state-Objekt. Die Referenzierung von Daten vor der Warteschlange verarbeitet wurde, daher geben Sie veraltete Daten, die nicht reflektieren, die ausstehenden änderungen, die Sie gemacht, in setState. Aus den docs:
Das bedeutet, mit "ist-Zustand" als Referenz für nachfolgende Aufrufe von setState unzuverlässig ist. Zum Beispiel:
Wenn Sie brauchen, um den aktuellen Zustand (z.B. Zusammenführen von Daten in einem verschachtelten Objekts), setState alternativ nimmt eine Funktion als argument anstelle eines Objekts; die Funktion wird aufgerufen, nachdem alle vorherigen updates zu Staat, und übergibt dem Staat als argument -- so kann dies benutzt werden, um Atomare änderungen garantiert die Achtung der vorherigen änderungen.
InformationsquelleAutor der Antwort bgannonpl
Wollte ich nicht installieren, die andere Bibliothek hier ist also noch eine andere Lösung.
Statt:
Tun Sie dies:
Oder, Dank @icc97 in den Kommentaren, noch prägnanter aber wohl weniger lesbar:
Auch, klar zu sein, dass diese Antwort nicht gegen die Bedenken, die @bgannonpl oben erwähnt.
InformationsquelleAutor der Antwort Ryan Shillington
Erhaltung der Vorherige Zustand basierend auf dem @bgannonpl Antwort:
Lodash Beispiel:
Zu überprüfen, ob es ordnungsgemäß funktioniert hat, können Sie den zweiten parameter der Funktion callback:
Ich verwendet
merge
weilextend
verwirft die anderen Eigenschaften, die sonst.Reagieren Unveränderlichkeit Beispiel:
InformationsquelleAutor der Antwort Martin Dawson
Meine Lösung für diese Art von situation zu verwenden ist, wie eine andere Antwort darauf hingewiesen, die Unveränderlichkeit Helfer.
Seit Einstellung des Staates in der Tiefe ist eine Häufig auftretende situation, die ich angelegt habe folgende mixin:
Dieses mixin ist für die meisten meiner Komponenten und ich in der Regel verwenden Sie nicht
setState
mehr direkt.Mit dieser mixin, alles, was Sie tun müssen, um die gewünschte Wirkung erzielen, ist der Aufruf der Funktion
setStateinDepth
in der folgenden Weise:Weitere Informationen:
setStateinDepth
siehe die Unveränderlichkeit Helfer Dokumentation.InformationsquelleAutor der Antwort Dorian
Als jetzt,
gemäß der Dokumentation https://reactjs.org/docs/react-component.html#setstate mit:
InformationsquelleAutor der Antwort egidiocs
Ich bin mit es6-Klassen, und ich endete mit mehreren komplexen Objekten sind auf meiner top-Zustand und wurde versucht zu machen, meine wichtigsten Komponente mehr modular, also habe ich eine einfache wrapper-Klasse zu halten, dem Staat auf der obersten Komponente, sondern erlauben weitere lokale Logik.
Wrapper-Klasse nimmt eine Funktion als Konstruktor, setzt eine Eigenschaft auf die Hauptkomponente Zustand.
Dann für jedes komplexe Eigenschaft, die auf der top-Zustand, erstelle ich eine StateWrapped Klasse. Sie können den Standard-Requisiten im Konstruktor hier, und Sie wird gesetzt, wenn die Klasse initialisiert ist, können Sie sich an die lokalen Staates für die Werte und den lokalen Zustand finden Sie lokale Funktionen, und es ging, bis die Kette:
Dann also meine top-level-Komponente benötigt nur den Konstruktor, um jede Klasse zu top-level state-Eigenschaft, eine einfache Wiedergabe und alle Funktionen, die die Kommunikation cross-Komponente.
Scheint zu funktionieren ziemlich gut für meine Zwecke, bear in Verstand, obwohl Sie nicht ändern können, den Zustand der Eigenschaften, die Sie zuordnen gewickelt Komponenten auf der obersten Ebene Komponente als jede gewickelt-Komponente ist die Verfolgung des eigenen Staates, sondern die Aktualisierung der Staat auf die erste Komponente jedes mal, wenn es änderungen.
InformationsquelleAutor der Antwort
Reagieren Zustand nicht ausführen die rekursive merge in
setState
zwar erwartet, dass es nicht in-place-state-member-updates zur gleichen Zeit. Sie haben entweder zu kopieren enthaltene Objekte/arrays selbst (mit-array.Segment oder Objekt.zuweisen) oder verwenden Sie das entsprechende Bibliothek.Wie dieser. NestedLink direkt unterstützt Umgang mit der Substanz Reagieren Zustand.
Auch, der link zu den
selected
oderselected.name
übergeben werden kann überall als single-prop und modifiziert es mitset
.InformationsquelleAutor der Antwort gaperton
haben Sie den ursprünglichen Zustand?
Werde ich einige von meinen eigenen code für Beispiel:
In einer app an der ich arbeite, das ist, wie ich habe bereits die Einstellung und die Verwendung von state. Ich glaube, auf
setState
dann können Sie nur Bearbeiten, was besagt Sie möchten individuell ich habe nannte es so:Halten Sie im Verstand, den Sie haben, um den Status innerhalb der
React.createClass
Funktion, die Sie aufgerufen habengetInitialState
InformationsquelleAutor der Antwort asherrard
Benutze ich die tmp var zu ändern.
InformationsquelleAutor der Antwort hkongm