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.
"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
PS: 'state.map zurückgeben (i => i.index == action.index? {... i, abgeschlossen: true}: i);' – zerkms