Quando si scrive un'applicazione react-redux
, ho bisogno di mantenere sia l'applicazione e stato di interfaccia utente nella struttura di stato globale. Qual è l'approccio migliore per progettare la sua forma?Come separare interfaccia utente e lo stato dell'applicazione in Redux
Diciamo che ho una lista di todo elementi:
{
items: [
{ id: 1, text: 'Chew bubblegum' },
{ id: 2, text: 'Kick ass' }
]
}
Ora voglio lasciare che gli utenti di selezionare ed espandere le voci. Ci sono (almeno) due opzioni come modellare la forma dello stato:
{
items: [
{ id: 1, text: 'Chew bubblegum', selected: true, expanded: false },
{ id: 2, text: 'Kick ass', selected: false, expanded: false }
]
}
Ma questo è mescolare lo stato di interfaccia utente (selected
e expanded
) con lo stato dell'applicazione. Quando ho salvare l'elenco delle cose da fare al server, voglio salvare solo lo stato dell'applicazione, non lo stato di interfaccia utente (in applicazione del mondo reale, lo stato di interfaccia utente può contenere stato di finestre di dialogo modali, messaggi di errore, stato di convalida, ecc).
Un altro approccio è quello di mantenere un altro array per lo stato di interfaccia utente delle voci:
{
items: [
{ id: 1, text: 'Chew bubblegum' },
{ id: 2, text: 'Kick ass' }
],
itemsState: [
{ selected: true, expanded: false },
{ selected: false, expanded: false }
]
}
poi si deve combinare questi due stati durante il rendering di un elemento. Posso immaginare che si può zip
quei due array nella funzione connect
per fare il rendering facile:
const TodoItem = ([item, itemState]) => ...;
const TodoList = items => items.map(item => (<TodoItem item={item} />));
export default connect(state => _.zip(state.items, state.itemsState))(TodoList);
Ma gli aggiornamenti di stato possano essere doloroso, perché items
e itemsState
devono essere tenuti in sincronia:
- Quando si rimuove un oggetto, è necessario rimuovere itemState corrispondente.
- Quando riordino articoli, itemsState deve essere prenotato anche.
- Quando l'elenco dei todo elementi viene aggiornato dal server, è necessario mantenere id nello stato di interfaccia utente e fare un po 'di riconciliazione.
C'è qualche altra opzione? Oppure esiste una libreria che aiuti a mantenere sincronizzati lo stato dell'app e lo stato dell'interfaccia utente?
Hai trovato qualche soluzione/implementazione per questo? –