Beim Schreiben einer react-redux
-Anwendung muss ich sowohl den Anwendungs- als auch den UI-Status im globalen Statusbaum beibehalten. Was ist der beste Ansatz, um seine Form zu gestalten?So trennen Sie den UI- und Anwendungsstatus in Redux
Lets sagen, dass ich eine Liste der ToDo Elemente haben:
{
items: [
{ id: 1, text: 'Chew bubblegum' },
{ id: 2, text: 'Kick ass' }
]
}
Jetzt möchte ich die Benutzer wählen lassen und die Elemente erweitern. Es gibt (mindestens) zwei Möglichkeiten, wie die Zustandsform zu modellieren:
{
items: [
{ id: 1, text: 'Chew bubblegum', selected: true, expanded: false },
{ id: 2, text: 'Kick ass', selected: false, expanded: false }
]
}
Aber das ist das Mischen der UI-Zustand (selected
und expanded
) mit dem Anwendungszustand. Wenn ich die ToDo-Liste auf dem Server speichere, möchte ich nur den Anwendungsstatus und nicht den UI-Status speichern (in der Real-World-App kann der UI-Status modale Dialoge, Fehlermeldungen, Validierungsstatus usw. enthalten).
Ein weiterer Ansatz ist ein weiteres Array für den UI-Zustand der Elemente zu halten:
{
items: [
{ id: 1, text: 'Chew bubblegum' },
{ id: 2, text: 'Kick ass' }
],
itemsState: [
{ selected: true, expanded: false },
{ selected: false, expanded: false }
]
}
Dann müssen Sie diese beiden Staaten kombinieren, wenn ein Element zu machen. Ich kann mir vorstellen, dass man zip
diese beiden Arrays in der connect
Funktion einfach zu machen machen:
const TodoItem = ([item, itemState]) => ...;
const TodoList = items => items.map(item => (<TodoItem item={item} />));
export default connect(state => _.zip(state.items, state.itemsState))(TodoList);
Aber Updates zu Staat kann schmerzhaft sein, weil items
und itemsState
muss synchron gehalten werden:
- Beim Entfernen eines Artikels muss der entsprechende itemState entfernt werden.
- Beim Nachbestellen von Artikeln muss itemsState ebenfalls neu geordnet werden.
- Wenn die Liste der Aufgaben vom Server aktualisiert wird, ist es erforderlich, IDs im UI-Status zu behalten und eine Abstimmung durchzuführen.
Gibt es noch eine andere Option? Oder gibt es eine Bibliothek, mit der App-Status und UI-Status synchronisiert werden?
Haben Sie eine Lösung/Implementierung dafür gefunden? –