2016-08-22 3 views

Antwort

5

Es ist akzeptabel, weil (zumindest in Ihrem Beispielcode) die Mutation auf dem flachen Objekt liegt, also ändern Sie kein Objekt, auf das sich momentan ein anderer Code bezieht.

Es würde nicht akzeptabel sein, eine flache Kopie zu erstellen und dann ein verschachteltes Objekt zu ändern! Der Schlüssel ist, dass Sie alle Objekte in der Objektbaumstruktur klonen, die sich auf dem Pfad zu der Deep-Eigenschaft befinden, die Sie ändern möchten.

Vom Redux FAQ:

Es ist wichtig, daran zu erinnern, dass, wenn Sie einen verschachtelten Wert aktualisieren, Sie auch neue Kopien von etwas über sie in Ihrem Zustand Baum zurückkehren. Wenn Sie state.a.b.c.d haben und eine Aktualisierung auf d, vornehmen möchten, müssen Sie auch neue Kopien von c, b, a und state zurückgeben. Diese state tree mutation diagram zeigt, wie eine Änderung tief in einem Baum Änderungen erfordert den ganzen Weg nach oben.

+0

Als Autor des Redux FAQ Sehen sie verwiesen und zitierte erhalten macht mich _very_ glücklich :) – markerikson

+1

@markerikson diesem speziellen Eintrag FAQ und Mutationsplan begleitet, ist sehr nützlich - ich Hand an der Zeit, meine Kollegen aus allen . – Brandon

+0

Freut mich zu hören! In diesem Fall könnten Sie auch an einer neuen Gruppe von Seiten interessiert sein, an denen ich für die Redux-Dokumente arbeite, über "Strukturierungsreduzierer". Problem ist https://github.com/reactjs/redux/issues/1784, WIP unter https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/StructuringReducers.md. Eine Seite spricht über "Immutable Update Patterns": https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/reducers/09-ImmutableUpdatePatterns.md. Ich würde mich über Feedback auf der Problemseite freuen. – markerikson

2

Ein Reducer in Redux sollte pure sein, was bedeutet, dass es garantieren muss, dass es nichts außerhalb seiner eigenen Funktion ändert oder bewirkt (d. H. Keine Nebenwirkungen erzeugt). Wenn Sie das übergebene Statusobjekt direkt mutieren, verletzen Sie dies.

Durch Erstellen einer neue Kopie, wissen Sie sicher, dass kein anderer Teil Ihrer Anwendung es verwendet (es wurde gerade erstellt, also wie konnten sie?). Dies wiederum bedeutet, dass es sicher ist, es zu mutieren, ohne sich über seltsame Nebenwirkungen Sorgen machen zu müssen.

Verwandte Themen