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 verwenden return state.setIn([action.index, 'completed'], true); zu verringern, boilerplate.
  • PS: return state.map(i => i.index == action.index ? {...i, completed: true} : i);
InformationsquelleAutor Ryan Peschel | 2015-10-29
Schreibe einen Kommentar