2016-09-22 6 views
2

Meine Zustände sind vom Typ Immutable.js in meinem redux Speicher und ich ändere nur den Zustand in meinen Reduzierern. Wäre es nicht sinnvoller, die Verwendung von unveränderlich zu überspringen und einen Parser zu haben, der meine App auf Befehl prüft und warnt, wenn ich meinen Shop außerhalb der Reducer-Funktionen ändere? Oder gibt es einen guten Grund, warum das nicht gemacht wird?Warum die Notwendigkeit von unveränderlichen Staaten für redux

+0

Wenn Wenn Sie nicht auf immutable.js angewiesen sind, können Sie [deep-freeze] (https://www.npmjs.com/package/deep-freeze) und [Object.assign()] verwenden (https: // developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) in Ihren Reducern. Das Problem besteht darin, dass das Aktualisieren von eingefrorenen Objekten mühsam wird, insbesondere bei verschachtelten Objekten, zB Object.assign ({}, freezedObj, {a: 1, b: Object.assign ({}, freezedObj.b, {c: 2}) }); Sie können [ImmutableAssign] (https://github.com/engineforce/ImmutableAssign) auschecken, das ein leichtgewichtiger unveränderlicher Helfer ist, der einfach über der Zuweisung stehen kann. – engineforce

Antwort

3

Sie können Ihren Status in Ihren Reduzierungen mutieren, wenn Ihnen danach ist. Redux schreibt nicht vor, dass Sie Ihren Staat nicht mutieren, aber er rät davon ab.

React-Redux, das nicht Redux ist, wurde mit der Annahme entworfen, dass der Zustand niemals mutiert wird. Dies ermöglicht sehr schnelle Prüfungen, um herauszufinden, ob sich irgendwo in der Hierarchie etwas geändert hat.

Redux selbst wird jedes Mal ein Ereignis auslösen, wenn eine Aktion verarbeitet wird, ob sie den Status ändert (durch Mutation oder durch Ersetzen) oder nicht. Es überprüft nie den Status außer undefined. Es ist egal, was du damit machst.

Unverwechselbarer Zustand hat viele Vorteile, aber der wichtigste in Redux ist, dass es schnell auf Änderungen überprüft werden kann. Ihr "Parser" zum Beispiel müsste jedes Mal, wenn er läuft, jede Eigenschaft und jedes Element jedes Objekts und Arrays in Ihrem gesamten Zustand aufsuchen, um eine sinnvolle Entscheidung zu treffen. Wenn React-Redux dasselbe tun würde, wäre es schrecklich langsam und niemand würde es benutzen.

Also, Tausende von Entwicklern beschränken sich auf die Unveränderlichkeit, weil sie echte Vorteile jenseits von Akademikern hat.

1

Es gibt ein paar Aspekte auf diese Frage:

  • Redux Sie reine Funktionen für Ihre Reduzierungen schreiben fördert. Dies ermöglicht Funktionen wie das Debuggen von Zeitreisen und macht sie testbarer. "Pure" bedeutet keine Nebenwirkungen, das heißt, Sie sollten keine übergebenen Daten direkt ändern. Stattdessen sollten die Datenaktualisierungen unwiderruflich durchgeführt werden (dh durch Kopieren der Teile der Daten, die Sie aktualisieren möchten)
  • React Die connect-Funktion von Redux nimmt an, dass die Aktualisierungen unwiderruflich durchgeführt werden, und führt Vergleiche durch, um festzustellen, ob sich die eingehenden Daten geändert haben. Wenn die Objektreferenzen die gleichen wie zuvor sind, wird davon ausgegangen, dass sich nichts geändert hat und die Komponente nicht erneut gerendert wird.

Beachten Sie jedoch, dass „unveränderliches Updates“ tut nicht du meint die Immutable.js Bibliothek verwenden. Es ist durchaus möglich, reine JS-Objekte unveränderbar zu aktualisieren.

Ich habe eine Reihe von Links zu nützlichen Artikeln zu diesen Themen als Teil meiner React/Redux links list. Siehe insbesondere die Kategorien Immutable Data Management und Functional Programming. Ich habe auch eine andere Seite, die eine Vielzahl von immutable data-related libraries auflistet, einschließlich Dienstprogramme, die es einfacher machen, JS-Daten zu aktualisieren. Schließlich habe ich eine Liste mit einer Anzahl von Redux-related dev tools, einschließlich Tools, die Sie warnen, wenn Sie Ihren Zustand versehentlich mutieren.

2

Ich denke, Ihre Idee von einer Art von Middleware, die auf unabsichtliche Zustandsmutationen überprüfen könnte, ist eine wirklich coole Idee, eigentlich. Ich bin mir nicht sicher, wie machbar/performant es wäre (es könnte sogar schon existieren und ich habe davon noch nichts gehört). Aber für diejenigen, die keine Art von Bibliothek wie Immutable.js oder seamless-immutable verwenden, kann ich sehen, wie das nützlich wäre.

Ich möchte nur, dass unveränderlich zu klären.js setzt durch, dass du deinen Zustand nicht mutierst, und es ist nur eine Konsequenz davon, dass es unmöglich wird, deinen Zustand von außerhalb deiner Reduzierer zu ändern. Es gibt einen wichtigen Unterschied zwischen dem allgemeinen Programmierkonzept der Unveränderlichkeit und dem Redux-spezifischen Konzept, nur Reduzierer zu verwenden, um Ihren Zustand zu ändern. Immutable.js erzwingt das erstere und erzwingt dadurch logischerweise auch das letztere.

jedoch die Tatsache, dass Immutable.js garantiert Ihnen nicht Zustand mutieren kann zufällig ist nicht der einzige Grund für die Bibliothek für Ihre Redux Speicher verwenden:

  • Leistung: Immutable.js hat Performance-Optimierungen Dies ermöglicht es, Unveränderlichkeit zu erzwingen, während tatsächlich die gleichen zugrunde liegenden Objekte im Speicher unter der Haube geteilt werden. Das bedeutet, dass Sie keine tiefen Kopien großer Datenmengen ausführen, nur um beispielsweise ein einzelnes Element in einem Array zu ändern. Dies kann in Situationen, in denen Ihr Geschäft große Datenmengen und/oder viele Statusänderungen aufweist, zu einem erheblich geringeren Speicherbedarf führen.
  • Hilfsmethoden: Während Sie können verschiedene Techniken verwenden, um Mutationsstatus zu vermeiden, hat Immutable.js eine wirklich nette API dafür. Zum Beispiel, wenn Sie jemals versucht haben, etwas zu ändern, die tief in Arrays und oder Objekte verschachtelt ist, werden Sie feststellen, dass es extrem schmerzhaft ist, dies mit nativen JS zu tun. Immutable.js macht es einfach, so tief zu bohren, wie Sie wollen und etwas zu ändern und eine Reihe von diesen zusammen zu ketten.

    return state 
     .updateIn(['todos', '5', 'attachment'], attachment => attachment.set('name', 'foo')) 
     .set('isProcessing', true) 
     .updateIn(['other', 'nested', 'stuff'], stuff => stuff.set('bar', 'baz')); 

aber sagen, dass es auf jeden Fall optional. Sie haben Alternativen wie die oben genannten nahtlose-unveränderlich bekam, lodash-fp, und tun es nur manuell wie folgt:

return Object.assign({}, state, { name: 'new name' }); 

Zum Vergleich: Die Immutable.js Alternative wäre nur:

return state.set('name', 'new name'); 
Verwandte Themen