2015-10-29 12 views
53

Also habe ich vor einer Woche mit React angefangen und ich bin unweigerlich zum Problem des Zustands gekommen und wie Komponenten mit dem Rest der App kommunizieren sollen. Ich suchte herum und Redux scheint der Geschmack des Monats zu sein. Ich lese die gesamte Dokumentation durch und denke, dass es eine ziemlich revolutionäre Idee ist. Hier sind meine Gedanken dazu:Ist Redux nicht gerade verherrlichter globaler Staat?

Staat ist allgemein vereinbart, ziemlich böse und eine große Quelle von Fehlern in der Programmierung zu sein. Anstatt alles in Ihrer App zu verteilen, sagt Redux, warum Sie nicht alles in einem globalen Statusbaum konzentriert haben, in dem Sie Aktionen zur Änderung ausgeben müssen? Hört sich interessant an. Alle Programme brauchen Status, also lasst es uns in einen unreinen Raum stecken und nur von dort aus modifizieren, damit Fehler einfach aufgespürt werden können. Dann können wir auch einzelne Zustandsstücke deklarativ an React-Komponenten binden und sie automatisch neu zeichnen lassen und alles ist schön.

Allerdings habe ich zwei Fragen zu diesem ganzen Design. Zum einen, warum muss der Staatsbaum unveränderlich sein? Angenommen, ich interessiere mich nicht für das Debuggen von Zeitreisen, das Warmladen und habe in meiner App bereits Undo/Redo implementiert. Es scheint nur so umständlich zu haben, dies zu tun:

case COMPLETE_TODO: 
    return [ 
     ...state.slice(0, action.index), 
     Object.assign({}, state[action.index], { 
     completed: true 
     }), 
     ...state.slice(action.index + 1) 
    ]; 

Statt dem:

case COMPLETE_TODO: 
    state[action.index].completed = true; 

Ganz zu schweigen ich ein Online-Whiteboard mache nur zu lernen, und jede Statusänderung könnte so einfach sein wie Hinzufügen eines Pinselstrichs zur Befehlsliste. Nach einer Weile (Hunderte von Pinselstrichen) könnte das Duplizieren dieses gesamten Arrays extrem teuer und zeitraubend werden.

Ich bin in Ordnung mit einem globalen Statusbaum, der unabhängig von der Benutzeroberfläche ist, die über Aktionen mutiert ist, aber muss es wirklich unveränderlich sein? Was ist los mit einer einfachen Implementierung wie diese (sehr grobe Entwurf. Schrieb in 1 Minute)?

Es ist immer noch ein globaler Statusbaum mutiert über Aktionen emittiert, aber extrem einfach und effizient.

+1

"Zum einen, warum muss der Staatsbaum unveränderlich sein?" --- Dann müssen Sie einen Algorithmus angeben, um festzustellen, ob sich Daten geändert haben. Es ist nicht möglich, es für eine beliebige Datenstruktur zu implementieren (wenn es veränderbar ist). Nimm 'immutablejs' und benutze' return state.setIn ([action.Index, 'abgeschlossen'], true); 'um den Standard zu reduzieren. – zerkms

+0

PS: 'state.map zurückgeben (i => i.index == action.index? {... i, abgeschlossen: true}: i);' – zerkms

Antwort

32

Ist Redux nicht gerade verherrlichter globaler Zustand?

Natürlich ist es. Das Gleiche gilt für jede Datenbank, die Sie jemals benutzt haben. Es ist besser, Redux als In-Memory-Datenbank zu behandeln, auf die Ihre Komponenten reaktiv angewiesen sind.

Die Unveränderbarkeit ermöglicht es, zu überprüfen, ob eine Unterstruktur sehr effizient geändert wurde, da dies die Überprüfung auf Identität vereinfacht.

Ja, Ihre Implementierung ist effizient, aber das gesamte virtuelle Dom muss jedes Mal neu gerendert werden, wenn der Baum irgendwie manipuliert wird.

Wenn Sie React verwenden, führt es eventuell einen Vergleich mit dem tatsächlichen dom durch und führt minimale batchoptimierte Manipulationen durch, aber das vollständige Top-down-Rendering ist immer noch ineffizient.

Für einen unveränderlichen Baum müssen staatenlose Komponenten nur prüfen, ob die Teilbäume, von denen sie abhängen, sich in Identitäten von vorherigen Werten unterscheiden, und wenn ja, kann das Rendering vollständig vermieden werden.

+2

Ist das nicht ein bisschen vorzeitige Optimierung obwohl? Woher wissen wir auch, dass die Kosten für die ständige Vervielfältigung von unveränderlichen Objekten geringer sind als das erneute Rendern des DOM (würde auch Reacts virtuelles DOM diese Kosten nicht erheblich verringern?) –

+3

Nun, GUI-Bibliotheken diese Art der Optimierung für eine lange Zeit (Siehe: http://bitquabit.com/post/the-more-things-change/) Das Plus-Management einer unveränderlichen Datenstruktur ist nicht so teuer, wie Sie vielleicht denken - wenn zum Beispiel ein Knoten geändert wird, nur eine einzige Kette von Eltern müssen verketten - der Rest der Knoten bleibt unberührt. Wir verdoppeln also nicht die * gesamte * Datenstruktur für jede Aktion - wir verwenden die Unterkomponenten, die nicht geändert wurden, um eine neue Datenstruktur zu erstellen. – lorefnon

+0

Was ist mit meiner Anordnung von Pinselstrichen? Gibt es eine unveränderliche und effiziente Möglichkeit, dieses Array von Hunderten von Elementen zu duplizieren, wenn nur ein Element am Ende des Arrays hinzugefügt wird? –