React et les Redux
deux 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/Redux
incapable de suivre les modifications et de ne pas pouvoir effectuer un nouveau rendu lorsque vos state/prop
modifications.
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 function
que 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 shouldUpdate
fonction 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 effects
fonction.
function doMistake(newValue) {
this.state = newValue
}
Ce qui précède ne doit pas être fait et seule la effects
fonction doit être utilisée pour mettre à jour l'état.
En termes de React, nous appelons effects
as setState
.
Pour Redux:
- L'
combineReducers
utilitaire de Redux vérifie les changements de référence.
- La
connect
mé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 mapState
fonctions 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 functions
sans 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.getElementById
etc 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.