React et les Reduxdeux ont besoin de fonctions pures couplées à une immuabilité pour fonctionner de manière prévisible.
Si vous ne suivez pas ces deux choses, votre application aura des bogues, le plus courant étant React/Reduxincapable de suivre les modifications et de ne pas pouvoir effectuer un nouveau rendu lorsque vos state/propmodifications.
En termes de React, considérons l'exemple suivant:
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();
}
L'état est détenu par l'objet état qui n'a ajouté que des propriétés. Cette application rend la propriété de l'application. Il ne doit pas toujours rendre l'état lorsque quelque chose se produit, mais doit vérifier si un changement s'est produit dans l'objet d'état.
Comme cela, nous avons une fonction d'effets, pure functionque nous utilisons pour affecter notre état. Vous voyez qu'il renvoie un nouvel état lorsque l'état doit être modifié et renvoie le même état lorsqu'aucune modification n'est requise.
Nous avons également une shouldUpdatefonction qui vérifie à l'aide de l'opérateur === si l'ancien état et le nouvel état sont identiques.
Pour faire des erreurs en termes de React, vous pouvez en fait procéder comme suit:
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;
}
Vous pouvez également faire des erreurs en définissant l'état directement et en n'utilisant pas de effectsfonction.
function doMistake(newValue) {
this.state = newValue
}
Ce qui précède ne doit pas être fait et seule la effectsfonction doit être utilisée pour mettre à jour l'état.
En termes de React, nous appelons effectsas setState.
Pour Redux:
- L'
combineReducersutilitaire de Redux vérifie les changements de référence.
- La
connectméthode de React-Redux génère des composants qui vérifient les changements de référence pour l'état racine et les valeurs de retour des mapStatefonctions pour voir si le composant encapsulé doit réellement être rendu de nouveau.
- Le débogage dans le temps nécessite que le réducteur soit
pure functionssans effets secondaires afin que vous puissiez passer correctement entre les différents états.
Vous pouvez facilement violer les trois ci-dessus en utilisant des fonctions impures comme réducteurs.
Ce qui suit est tiré directement des documents redux:
C'est ce qu'on appelle un réducteur, car c'est le type de fonction que vous transmettez Array.prototype.reduce(reducer, ?initialValue).
Il est très important que le réducteur reste pur. Choses que vous ne devriez jamais faire à l'intérieur d'un réducteur:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Compte tenu des mêmes arguments, il doit calculer l'état suivant et le renvoyer. Pas de surprises. Pas d'effets secondaires. Aucun appel API. Pas de mutations. Juste un calcul.
window.getElementByIdetc donc exécuter la même fonction avec les mêmes paramètres peut avoir des résultats différents selon les effets secondaires. C'est là que redux échouerait.