Quindi ho iniziato a imparare React una settimana fa e sono inevitabilmente arrivato al 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 in realtà sia un'idea piuttosto rivoluzionaria. Ecco i miei pensieri su di esso:
Lo stato è generalmente riconosciuto come piuttosto malvagio e una grande fonte di bug nella programmazione. Invece di spargere tutto nella tua app, Redux dice perché non concentrarti tutto in un albero di stato globale che devi emettere azioni per cambiare? Sembra interessante. Tutti i programmi hanno bisogno di uno stato, quindi inseriamolo in uno spazio impuro e modifichiamolo solo dall'interno in modo che i bug siano facili da rintracciare. Quindi possiamo anche associare in modo dichiarativo singoli pezzi di stato ai componenti React e ridisegnarli automaticamente e tutto è bello.
Tuttavia, ho due domande su questo intero progetto. Per prima cosa, perché l'albero degli stati deve essere immutabile? Diciamo che non mi interessa il debug del viaggio nel tempo, il ricaricamento a caldo e ho già implementato undo / redo nella mia app. Sembra così ingombrante 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 del fatto che sto creando una lavagna online 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 dell'intero array potrebbe iniziare a diventare estremamente costosa e richiedere molto tempo.
Sono d'accordo con un albero di stato globale indipendente dall'interfaccia utente che viene modificato tramite azioni, ma è davvero necessario che sia 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.
immutablejs
e usareturn state.setIn([action.index, 'completed'], true);
per ridurre il boilerplate.