Redux è una piccola libreria che rappresenta lo stato come oggetti (immutabili). E nuovi stati passando lo stato corrente attraverso pure funzioni per creare uno stato di oggetto/applicazione completamente nuovo.
Se i tuoi occhi non sono lucidi, non preoccuparti. Per riassumere, Redux non rappresenta cambiamenti nello stato della tua applicazione modificando gli oggetti (come faresti con i paradigmi orientati agli oggetti). Invece le modifiche di stato sono rappresentate come la differenza tra l'oggetto di input e l'oggetto di output (var output = reducer(input)
). Se si muta o input
o output
, si annulla lo stato.
Per riassumere in un altro modo, l'immutabilità è un requisito di Redux perché Redux rappresenta lo stato dell'applicazione come "snapshot di oggetti congelati". Con queste istantanee discrete , è possibile salvare il proprio stato o stato inverso e in genere disporre di una maggiore "contabilità" per tutte le modifiche di stato.
Lo stato della tua app è solo modificato da una categoria di funzioni pure denominate riduttori. Riduttori hanno 2 importanti proprietà:
- Essi mai mutano, restituendo oggetti di nuova costruzione: ciò permette un ragionamento su ingresso + uscita senza effetti collaterali
- La loro firma è sempre
function name(state, action) {}
, in modo che rende facile comporli:
assumere lo stato si presenta così:
var theState = {
_2ndLevel: {
count: 0
}
}
Vogliamo incrementare il conteggio, quindi facciamo questi riduttori
const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount';
function _2ndlevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
var newState = Objectd.assign({}, state);
newState.count++
return newState;
}
}
function topLevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
return Objectd.assign({}, {_2ndLevel: _2ndlevel(state._2ndlevel)});
}
}
Nota l'uso di Objectd.assign({}, ...)
per creare uno completamente nuovo oggetti in ogni riduttore:
Supponendo che abbiamo cablato Redux a questi riduttori, quindi se usiamo il sistema di eventi di Redux per innescare un cambio di stato ...
dispatch({type: INCR_2ND_LEVEL_COUNT})
... Redux chiamerà:
theNewState = topLevel(theState, action);
NOTA: action
da dispatch()
Ora theNewState
è un oggetto completamente nuovo .
Nota: È possibile applicare immutabilità con a library (o new language features), o semplicemente stare attenti a non mutare nulla: D
Per uno sguardo più profondo, mi raccomando si checkout this video da Dan Abramov (il creatore). Dovrebbe rispondere a tutte le domande persistenti che hai.
Si rende le cose facile ragionare circa, e contribuisce a ti impedisce di cambiare accidentalmente lo stato al di fuori del modo in cui Redux lo fa. –
tx per la risposta ... ma il suo tipo di vago .. So che è quello che dicono sempre .. cambiare un nome da A a B non rende più complesso o più difficile ragionare su ... – born2net
Lasciami mettere in questo modo: se so che una struttura dati è Immutable, so che ci sono parti del codice che assolutamente non possono cambiarlo. Ciò rende molto più semplice testare il codice e trovare bug. –