Così ho iniziato a imparare React una settimana fa e ho inevitabilmente raggiunto il problema dello stato e di come i componenti dovrebbero comunicare con il resto dell'app. Ho cercato in giro e Redux sembra essere il sapore del mese. Ho letto tutta la documentazione e penso che sia davvero un'idea piuttosto rivoluzionaria. Ecco i miei pensieri su di esso:Non è Redux solo stato globale glorificato?
Lo stato è generalmente accettato di essere piuttosto malvagio e una grande fonte di bug nella programmazione. Invece di disperdere tutto nella tua app, Redux dice perché non solo concentrarti tutto su un albero di stato globale che devi emettere azioni da modificare? Sembra interessante. Tutti i programmi hanno bisogno di stato, quindi mettiamolo in uno spazio impuro e modificalo solo da lì, quindi i bug sono facili da rintracciare. Quindi possiamo anche legalmente dichiarare pezzi di stato singoli ai componenti React e farli ridisegnare automaticamente e tutto è bello.
Tuttavia, ho due domande su questo intero progetto. Per uno, perché l'albero statale deve essere immutabile? Dite che non mi interessa il debug del viaggio nel tempo, il ricaricamento a caldo e ho già implementato l'annullamento/ripristino nella mia app. Sembra proprio così scomodo dover fare questo:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Invece di questo:
case COMPLETE_TODO:
state[action.index].completed = true;
Per non parlare sto facendo una lavagna on-line solo per imparare e ogni cambiamento di stato potrebbe essere semplice come aggiungere un tratto di pennello all'elenco dei comandi. Dopo un po '(centinaia di pennellate) la duplicazione di questo intero array potrebbe iniziare a diventare estremamente costosa e dispendiosa in termini di tempo.
Sto bene con un albero di stato globale che è indipendente dall'interfaccia utente che è mutato tramite azioni, ma ha davvero bisogno di essere immutabile? Cosa c'è di sbagliato in una semplice implementazione come questa (bozza molto approssimativa, scritta in 1 minuto)?
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;
}
È ancora un albero di stato globale mutato tramite azioni emesse ma estremamente semplice ed efficiente.
"Per uno, perché l'albero di stato deve essere immutabile?" --- allora devi fornire un algoritmo per determinare se i dati sono cambiati. Non è possibile implementarlo per una struttura di dati arbitraria (se è mutabile). Prendi 'immutablejs' e usa' return state.setIn ([action.index, 'completed'], true); 'per ridurre il boilerplate. – zerkms
PS: 'return state.map (i => i.index == action.index? {... i, completato: true}: i);' – zerkms