Reagieren und Reduxbeide benötigen reine Funktionen gepaart mit Unveränderlichkeit, um vorhersehbar zu laufen.
Wenn Sie diese beiden Dinge nicht befolgen, weist Ihre App Fehler auf. Die häufigste ist, dass React/ReduxÄnderungen nicht nachverfolgt und bei state/propÄnderungen nicht erneut gerendert werden können .
Betrachten Sie in Bezug auf React das folgende Beispiel:
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();
}
Der Status wird von dem Statusobjekt gehalten, das nur eine Eigenschaft hinzugefügt hat. Diese App rendert die App-Eigenschaft. Es sollte nicht immer den Status rendern, wenn etwas passiert, sondern prüfen, ob eine Änderung im Statusobjekt aufgetreten ist.
So haben wir eine Effektfunktion, mit pure functionder wir unseren Zustand beeinflussen. Sie sehen, dass es einen neuen Status zurückgibt, wenn der Status geändert werden soll, und denselben Status zurückgibt, wenn keine Änderung erforderlich ist.
Wir haben auch eine shouldUpdateFunktion, die mit dem Operator === prüft, ob der alte und der neue Zustand gleich sind.
Um Fehler in Bezug auf React zu machen, können Sie tatsächlich Folgendes tun:
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;
}
Sie können auch Fehler machen, indem Sie den Status direkt festlegen und die effectsFunktion nicht verwenden .
function doMistake(newValue) {
this.state = newValue
}
Dies sollte nicht durchgeführt werden und es sollte nur eine effectsFunktion zum Aktualisieren des Status verwendet werden.
In Bezug auf React nennen wir effectsas setState.
Für Redux:
- Das
combineReducersDienstprogramm von Redux sucht nach Referenzänderungen.
- Die
connectMethode von React-Redux generiert Komponenten, die Referenzänderungen sowohl für den Stammstatus als auch für die Rückgabewerte von mapStateFunktionen überprüfen, um festzustellen , ob die umschlossene Komponente tatsächlich neu gerendert werden muss.
- Das Debuggen von Zeitreisen erfordert, dass der Reduzierer
pure functionskeine Nebenwirkungen aufweist, damit Sie korrekt zwischen verschiedenen Zuständen wechseln können.
Sie können die oben genannten drei leicht verletzen, indem Sie unreine Funktionen als Reduzierstücke verwenden.
Folgendes wird direkt aus Redux-Dokumenten entnommen:
Es wird als Reduzierer bezeichnet, da dies die Art von Funktion ist, an die Sie übergeben würden Array.prototype.reduce(reducer, ?initialValue).
Es ist sehr wichtig, dass der Reduzierer rein bleibt. Dinge, die Sie niemals in einem Reduzierer tun sollten:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Bei gleichen Argumenten sollte der nächste Status berechnet und zurückgegeben werden. Keine Überraschungen. Keine Nebenwirkungen. Keine API-Aufrufe. Keine Mutationen. Nur eine Berechnung.
window.getElementByIdetc, also kann das Ausführen derselben Funktion mit denselben Parametern je nach Nebenwirkungen zu unterschiedlichen Ergebnissen führen. Hier würde Redux scheitern.