Ist das nicht wiedermal nur verherrlicht globalen Staat?
Also habe ich angefangen zu lernen, Reagieren vor einer Woche und ich unweigerlich habe, um das problem des Staates und, wie die Komponenten sollen für die Kommunikation mit dem rest der app. Ich suchte herum und Redux scheint der Geschmack des Monats. Ich habe gelesen durch alle Unterlagen und ich denke, es ist eigentlich eine ziemlich revolutionäre Idee. Hier sind meine Gedanken über Sie:
Zustand ist in der Regel vereinbart werden ziemlich böse, und eine große Quelle von Fehlern in der Programmierung. Statt Streuung es alles in Ihrem app Redux sagt warum nicht einfach haben, alles konzentriert in einer globalen Zustand Baum, den Sie haben, zu emittieren Aktionen zu ändern? Hört sich interessant an. Alle Programme müssen dem Staat so let ' s stick it in einem unreinen Raum und nur zu ändern, es von innerhalb es damit Fehler leicht aufspüren. Dann können wir auch deklarativ binden die einzelnen staatlichen Stücke zu Reagieren, die Komponenten und lassen Sie Sie automatisch neu gezeichnet und alles ist schön.
Allerdings, ich habe zwei Fragen über das gesamte design. Zum einen, warum muss sich der Staat Baum müssen unveränderlich sind? Sagen, ich don ' T care about time travel Debuggen, hot reload, und bereits implementierte undo/redo ist in meiner app. Es scheint nur so umständlich zu haben, um dies zu tun:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Stattdessen:
case COMPLETE_TODO:
state[action.index].completed = true;
Nicht zu erwähnen, ich bin ein online-whiteboard, nur um zu lernen und jeder Staat ändern könnte so einfach sein wie das hinzufügen eines Pinselstrichs, um die command-list. Nach einer Weile (Hunderte von Pinselstrichen) duplizieren das gesamte array könnte beginnen immer extrem teuer und zeitaufwendig.
Ich bin ok mit einem globalen Zustand Baum, das unabhängig von der Benutzeroberfläche, die mutiert durch Aktionen, aber ist es wirklich unveränderlich? Was ist falsch an einer einfachen Umsetzung, wie diese (sehr groben Entwurf. geschrieben in 1 minute)?
var store = { items: [] };
export function getState() {
return store;
}
export function addTodo(text) {
store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
store.items[index].completed = true;
}
Es ist immer noch eine Globale Zustand Baum mutiert über Aktionen emittiert, aber extrem einfach und effizient.
- "Zum einen, warum muss sich der Staat Baum müssen unveränderlich sind?" --- dann müssen Sie einen Algorithmus, um zu bestimmen, ob Daten sich geändert hat. Es ist nicht möglich, Sie zu implementieren, für eine beliebige Datenstruktur (wenn es änderbar). Nehmen
immutablejs
und verwendenreturn state.setIn([action.index, 'completed'], true);
zu verringern, boilerplate. - PS:
return state.map(i => i.index == action.index ? {...i, completed: true} : i);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es natürlich. Aber das gleiche gilt für jede Datenbank, die Sie je benutzt haben. Es ist besser zu behandeln Redux als eine in-memory-Datenbank, die Ihre Komponenten können reaktiv angewiesen sind.
Unveränderlichkeit ermöglicht die überprüfung, ob alle sub-tree verändert worden, sehr effizient, denn es vereinfacht die Festlegung auf eine Identität zu überprüfen.
Ja, Ihre Umsetzung ist effizient, aber die gesamte virtuelle dom wird neu gerendert, jedes mal, wenn der Baum ist irgendwie manipuliert.
Wenn Sie Reagieren, es wird schließlich nicht ein diff gegen den aktuellen dom und führen minimale batch-optimiert Manipulationen, aber die vollständige top-down re-rendering ist immer noch ineffizient.
Für eine unveränderliche Struktur, zustandslose Komponenten müssen nur überprüfen, wenn die Teilstruktur(s) es hängt davon ab, unterscheiden sich die Identitäten im Vergleich zu den vorherigen, Wert(E), und wenn dem so ist - beim Rendern kann ganz vermieden werden.