J'allais commenter la réponse actuellement acceptée, mais je n'ai plus de place !
Tout d'abord, il est important de ne plus penser en termes d'événements du cycle de vie lors de l'utilisation de composants fonctionnels. Pensez en termes de changements de propriétés/états. J'ai eu une situation similaire où je voulais seulement qu'un composant particulier useEffect
à déclencher lorsqu'un accessoire particulier ( parentValue
dans mon cas) change par rapport à son état initial. J'ai donc créé une référence basée sur sa valeur initiale :
const parentValueRef = useRef(parentValue);
et a ensuite inclus le texte suivant au début de l'article. useEffect
fn :
if (parentValue === parentValueRef.current) return;
parentValueRef.current = parentValue;
(Fondamentalement, n'exécutez pas l'effet si parentValue
n'a pas changé. Mettez à jour la référence si elle a changé, prête pour la prochaine vérification, et continuez à exécuter l'effet).
Ainsi, bien que d'autres solutions proposées puissent résoudre le cas d'utilisation particulier que vous avez fourni, il sera utile à long terme de changer votre façon de penser par rapport aux composants fonctionnels.
Considérez qu'il s'agit principalement de rendre un composant en fonction de certains accessoires.
Si vous avez vraiment besoin d'un état local, alors useState
fournira cela, mais ne supposez votre problème sera résolu en stockant l'état local.
Si vous disposez d'un code qui modifie vos accessoires pendant le rendu, cet "effet secondaire" doit être enveloppé dans une balise useEffect
mais le but est d'avoir un rendu propre qui n'est pas affecté par quelque chose qui change pendant le rendu. Le site useEffect
sera exécuté après que le rendu soit terminé et, comme vous l'avez souligné, il est exécuté à chaque rendu - à moins que le second paramètre ne soit utilisé pour fournir une liste de props/states afin d'identifier les éléments modifiés qui feront qu'il sera exécuté plusieurs fois.
Bonne chance dans votre voyage vers les composants fonctionnels / crochets ! Il est parfois nécessaire de désapprendre quelque chose pour s'approprier une nouvelle façon de faire les choses :) Ce document est une excellente introduction : https://overreacted.io/a-complete-guide-to-useeffect/
2 votes
Avez-vous regardé dans
React.useMemo
?