Dans ce numéro de GitHub, j'ai proposé essentiellement de changer:
x = useCallback( ... , []);
À:
x = useRef( ... ).current;
Les deux sont identiques mais avec useRef
React ne compare pas les dépendances.
Pour lequel une réponse est venue avec une question:
Y a-t-il jamais une situation où un useMemo sans dépendance ou useCallback serait un meilleur choix que useRef?
Je ne peux pas penser à un, mais j'ai peut-être ignoré certains cas d'utilisation.
Alors, quelqu'un peut-il penser à une telle situation?
useCallback(x,[])
enuseRef(x)
fonctionne de la même manière.useRef(x).current
C'est.useCallback(cb, [])
vsuseRef(cb).current
moi - même. Bien que,useMemo(cb, [])
soit différentuseRef(cb).current
en un sensuseMemo
, "ne recalculera la valeur mémorisée que lorsque l'une des dépendances a changé". VersususeRef
qui recalcule toujours la valeur quoi qu'il arrive.useRef
ne recalcule jamais - il renvoie toujours la valeur initiale.Bien que vous puissiez utiliser useRef pour émuler useCallback ou avec une dépendance vide, vous ne pouvez pas l'utiliser pour tous les scénarios possibles de useCallback qui consiste à se remémorer lorsque l'une des dépendances change.
De plus, cela ne fera pas beaucoup de différence de performance si vous utilisez
useCallback with empty dependency
ou useRef car il n'a pas à effectuer de comparaison lourde.De plus, si vous modifiez un peu l'implémentation de la fonction pour la recréer lors d'un changement de paramètre particulier, vous pouvez simplement mettre à jour l'implémentation avec
useCallback
et ajouter le paramètre supplémentaire en tant que dépendance. Cependant, si vous l'implémentez avec useRef, vous devez revenir àuseCallback
la source
Parce que la sortie de useRef (() => {...}). Current est modifiable.
Ce qui peut provoquer des effets secondaires étranges dans votre code. Je peux modifier la valeur du courant à tout moment. https://codesandbox.io/s/confident-monad-vjeuw
Ce serait le cas d'utilisation pour ne pas vouloir utiliser useRef
la source
x = useRef(value).current
ne retourne jamais une instance mutable -ref
n'est jamais retourné;current
est. C'est la même chose qu'avec lauseCallback
version.