Perché spostiamo il nostro stato persistente in un database, invece di lasciare che ciascuno dei nostri componenti di back-end gestisca il loro stato in file separati?
Perché rende molto più semplice eseguire query, eseguire il debug e serializzare lo stato generale dell'applicazione.
Redux è stato ispirato da un linguaggio chiamato Elm, che promuove anche l'uso di un singolo modello. Il creatore di Elm ha un'ulteriore giustificazione sul perché questa è una qualità importante per le applicazioni.
C'è un'unica fonte di verità. Gli approcci tradizionali ti costringono a scrivere una quantità decente di codice personalizzato e soggetto a errori per sincronizzare lo stato tra molti diversi componenti stateful. (Lo stato di questo widget deve essere sincronizzato con lo stato dell'applicazione, che deve essere sincronizzato con qualche altro widget, ecc.) Inserendo tutto il tuo stato in una posizione, elimini un'intera classe di bug in cui due componenti ottengono in stati contraddittori. Pensiamo anche che finirai per scrivere meno codice. Questa è stata la nostra osservazione in Elm finora.
ho trovato questo concetto molto più facile da imparare e capire, mentre affrontando da ClojureScript di Re-frame e guardare David Nolen di videos on Om Next. Il Re-frame README per il progetto è anche una grande risorsa di apprendimento.
Ecco alcuni dei miei consigli personali sul perché lo stato globale è una soluzione più elegante.
componenti più semplici
uno scenario comune che si pone in molte applicazioni basate su componenti stateful, è la necessità di modificare lo stato che vive in un altro componente.
Ad esempio, facendo clic su un pulsante di modifica in un componente NameTag
dovrebbe aprire un editor che permette all'utente di modificare alcuni dati che vive nello stato di un Profile
componente (un genitore di NameTag
). Il modo per risolvere questo problema è quello di tramandare i callback del gestore, che quindi propagano i dati di backup dell'albero dei componenti. Questo schema si traduce in confusi flussi di dati secondari all'interno del flusso di dati unidirezionale esistente delle applicazioni React.
Con uno stato globale, i componenti inviano solo azioni che attivano gli aggiornamenti a tale stato. Sia i componenti che le azioni possono essere parametrizzati per inviare all'utente informazioni contestuali (ad esempio, qual è l'ID dell'utente di cui devo modificare il nome).
Non devi pensare molto a come comunicare i cambiamenti allo stato, perché sai esattamente dove si trova lo stato, e le azioni sono il meccanismo predefinito per inviare le modifiche lì.
funzioni pure
Quando il tuo stato dell'applicazione vive in un unico luogo, i componenti che lo rendono in grado di essere funzioni puri che prendono Stato come argomento. Guardano solo i dati e restituiscono una vista che può inviare azioni per fare aggiornamenti.
Queste funzioni sono trasparenti di riferimento, il che significa che per ogni dato insieme di input, c'è sempre lo stesso output. Questo è l'ideale per i test e si finisce con componenti che sono semplici da testare.
serializzazione
In un tradizionale React applicazione con componenti stateful, serializzare l'intero stato applicazione sarebbe un incubo. Ciò implicherebbe l'attraversamento dell'intero albero dei componenti e l'estrazione del valore di stato da ciascun componente, prima di collezionarli tutti in una struttura dati e codificarli.
Ri-gonfiare i componenti con uno stato serializzato significherebbe una procedura simile, eccetto che dovresti anche capire quali tipi di componenti erano responsabili di quali dati, in modo da poter ricreare accuratamente l'albero dei componenti. Ciò significherebbe anche memorizzare ulteriori informazioni sui tipi di componenti nel tuo stato.
Con lo stato globale, è possibile semplicemente codificarlo e decodificarlo esattamente dove si trova.
Undo/Redo
Per implementare undo/redo con lo stato globale, è necessario memorizzare gli stati in una lista, invece di sostituire l'ultimo quando aggiorna. Un puntatore indice può controllare lo stato corrente in cui ci si trova.
Con componenti stateful, questo richiederebbe a ciascun componente di implementare questo meccanismo. Non solo questo è un lavoro extra, ma crea anche un altro punto nella tua applicazione per l'introduzione di bug. Il miglior codice non è un codice, come si suol dire.
Riproduzione Azione
In Redux (e il modello di flusso in generale) siamo in grado di tenere traccia delle azioni che sono state giocate, poi riprodurli in un altro contesto per produrre esattamente nello stesso stato.
Se si introduce lo stato locale del componente, è possibile dire addio a questo. Gli aggiornamenti allo stato locale possono provenire da gestori di eventi DOM, richieste di rete, operazioni asincrone (e molto altro). Queste operazioni non possono essere serializzate, il che significa che non possono essere riprodotte neanche.
Penso che ci sia [una discussione pertinente al riguardo sul loro GitHub] (https://github.com/reactjs/redux/issues/1385)? Non è stata data una risposta ufficiale, ma è in discussione - non sono sicuro che sia davvero d'aiuto. – aug
cosa succede se ridisegnate la vostra app e lo stato non globale deve essere globale ora? – Theo
@aug: Grazie per aver pubblicato. Una grande quantità di informazioni lì. Aiuta a rispondere alla domanda che ho su "Posso usare i negozi redux E reagire stato?" – Skitterm