Le hook useEffect React exécutera la fonction passée à chaque modification. Cela peut être optimisé pour qu'il n'appelle que lorsque les propriétés souhaitées changent.
Que faire si je veux appeler une fonction d'initialisation à partir de componentDidMount
et ne pas la rappeler en cas de modifications? Disons que je veux charger une entité, mais la fonction de chargement n'a pas besoin de données du composant. Comment pouvons-nous faire cela en utilisant le useEffect
crochet?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Avec des crochets, cela pourrait ressembler à ceci:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
la source
la source
TL; DR
useEffect(yourCallback, [])
- ne déclenchera le rappel qu'après le premier rendu.Explication détaillée
useEffect
s'exécute par défaut après chaque rendu du composant (provoquant ainsi un effet).Lorsque vous placez
useEffect
votre composant, vous indiquez à React que vous souhaitez exécuter le rappel en tant qu'effet. React exécutera l'effet après le rendu et après avoir effectué les mises à jour DOM.Si vous ne transmettez qu'un rappel, le rappel s'exécutera après chaque rendu.
Si vous passez un deuxième argument (tableau), React exécutera le rappel après le premier rendu et à chaque fois qu'un des éléments du tableau est modifié. par exemple lors du placement
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- le rappel s'exécutera après le premier rendu et après tout rendu dont l'unsomeVar
ousomeOtherVar
est modifié.En passant le deuxième argument un tableau vide, React comparera après chaque rendu le tableau et verra que rien n'a été changé, appelant ainsi le rappel uniquement après le premier rendu.
la source
crochet useMountEffect
Exécuter une fonction une seule fois après le montage des composants est un modèle si courant qu'il justifie un hook qui lui est propre qui cache les détails de l'implémentation.
Utilisez-le dans n'importe quel composant fonctionnel.
À propos du hook useMountEffect
Lors de l'utilisation
useEffect
avec un deuxième argument de tableau, React exécutera le rappel après le montage (rendu initial) et après que les valeurs du tableau aient changé. Puisque nous passons un tableau vide, il ne fonctionnera qu'après le montage.la source
useMount
lorsque votre fonction d'effet a besoin de quelque chose des accessoires mais n'a jamais besoin de s'exécuter à nouveau même si cette valeur change sans linter warnig:useEffect(()=>console.log(props.val),[])
aura un avertissement de dépendance manquant maisuseMount(()=>console.log(props.val))
ne provoquera pas d'avertissement mais "fonctionne". Je ne suis pas sûr s'il y aura un problème avec le mode concurrent.Passez un tableau vide comme deuxième argument à
useEffect
. Cela indique efficacement à React, en citant les documents :Voici un extrait que vous pouvez exécuter pour montrer que cela fonctionne:
la source
J'aime définir une
mount
fonction, cela trompe EsLint de la même manièreuseMount
et je trouve cela plus explicite.la source
L'astuce est que useEffect prend un deuxième paramètre.
Le deuxième paramètre est un tableau de variables que le composant vérifiera pour s'assurer qu'il a changé avant de refaire le rendu. Vous pouvez mettre ici tous les éléments d'accessoires et l'état que vous souhaitez vérifier.
Ou, ne mettez rien:
Cela garantira que useEffect ne s'exécute qu'une seule fois.
Note de la documentation:
Si vous utilisez cette optimisation, assurez-vous que le tableau inclut toutes les valeurs de la portée du composant (telles que les accessoires et l'état) qui changent au fil du temps et qui sont utilisées par l'effet. Sinon, votre code référencera les valeurs obsolètes des rendus précédents.
la source