Reagire ed Redux
entrambi hanno bisogno di funzioni pure abbinate a immutabilità per funzionare in modo prevedibile.
Se non segui queste due cose, la tua app avrà dei bug, il più comune React/Redux
non è in grado di tracciare le modifiche e non è in grado di eseguire nuovamente il rendering quando le state/prop
modifiche.
In termini di React, considera il seguente esempio:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
Lo stato è trattenuto dall'oggetto state che ha solo aggiunto proprietà. Questa app esegue il rendering della proprietà dell'app. Non dovrebbe sempre rendere lo stato quando succede qualcosa, ma dovrebbe verificare se si è verificato un cambiamento nell'oggetto stato.
Allo stesso modo, abbiamo una funzione di effetti, pure function
che usiamo per influenzare il nostro stato. Si vede che restituisce un nuovo stato quando lo stato deve essere modificato e restituisce lo stesso stato quando non è richiesta alcuna modifica.
Abbiamo anche una shouldUpdate
funzione che controlla usando l'operatore === se il vecchio stato e il nuovo stato sono uguali.
Per fare errori in termini di React, puoi effettivamente fare quanto segue:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
Puoi anche fare errori impostando direttamente lo stato e non usando la effects
funzione.
function doMistake(newValue) {
this.state = newValue
}
Quanto sopra non dovrebbe essere fatto e solo la effects
funzione dovrebbe essere usata per aggiornare lo stato.
In termini di React, chiamiamo effects
as setState
.
Per Redux:
- L'
combineReducers
utilità di Redux verifica le modifiche di riferimento.
- Il
connect
metodo di React-Redux genera componenti che controllano le modifiche di riferimento sia per lo stato radice che per i valori di ritorno dalle mapState
funzioni per vedere se il componente spostato deve effettivamente eseguire nuovamente il rendering.
- Il debug dei viaggi nel tempo richiede che il riduttore
pure functions
non abbia effetti collaterali in modo da poter saltare correttamente tra stati diversi.
Puoi facilmente violare i tre precedenti usando funzioni impure come riduttori.
Quello che segue è preso direttamente dai documenti redux:
Si chiama riduttore perché è il tipo di funzione a cui si passerebbe Array.prototype.reduce(reducer, ?initialValue)
.
È molto importante che il riduttore rimanga puro. Cose che non dovresti mai fare all'interno di un riduttore:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Dati gli stessi argomenti, dovrebbe calcolare lo stato successivo e restituirlo. Niente sorprese. Nessun effetto collaterale Nessuna chiamata API. Nessuna mutazione. Solo un calcolo.
window.getElementById
ecc., Quindi eseguire la stessa funzione con gli stessi parametri può avere risultati diversi a seconda degli effetti collaterali. È qui che il redux fallirebbe.