Reagieren und Redux
beide 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 function
der 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 shouldUpdate
Funktion, 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 effects
Funktion nicht verwenden .
function doMistake(newValue) {
this.state = newValue
}
Dies sollte nicht durchgeführt werden und es sollte nur eine effects
Funktion zum Aktualisieren des Status verwendet werden.
In Bezug auf React nennen wir effects
as setState
.
Für Redux:
- Das
combineReducers
Dienstprogramm von Redux sucht nach Referenzänderungen.
- Die
connect
Methode von React-Redux generiert Komponenten, die Referenzänderungen sowohl für den Stammstatus als auch für die Rückgabewerte von mapState
Funktionen überprüfen, um festzustellen , ob die umschlossene Komponente tatsächlich neu gerendert werden muss.
- Das Debuggen von Zeitreisen erfordert, dass der Reduzierer
pure functions
keine 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.getElementById
etc, also kann das Ausführen derselben Funktion mit denselben Parametern je nach Nebenwirkungen zu unterschiedlichen Ergebnissen führen. Hier würde Redux scheitern.