En esta edición de GitHub, esencialmente propuse cambiar:
x = useCallback( ... , []);
A:
x = useRef( ... ).current;
Los dos son iguales pero con useRef
React no compara las dependencias.
Para lo cual llegó una respuesta con una pregunta:
¿Hay alguna situación en la que una useMemo o useCallback sin dependencia sea una mejor opción que useRef?
No puedo pensar en uno, pero puedo haber pasado por alto algunos casos de uso.
Entonces, ¿alguien puede pensar en tal situación?
useCallback(x,[])
auseRef(x)
funciona igual.useRef(x).current
es decir.useCallback(cb, [])
vsuseRef(cb).current
mí mismo. Aunque,useMemo(cb, [])
es diferenteuseRef(cb).current
en un sentido queuseMemo
, "solo volverá a calcular el valor memorizado cuando una de las dependencias haya cambiado". VersususeRef
que siempre vuelve a calcular el valor pase lo que pase.useRef
nunca vuelve a calcular: siempre devuelve el valor inicial.Si bien puede usar useRef para emular useCallback o con una dependencia vacía, no puede usarlo para todos los escenarios posibles de useCallback que es para conmemorar cuando alguna de las dependencias cambia.
Además, no hará una gran diferencia de rendimiento si usa
useCallback with empty dependency
o usa Ref, ya que no tiene que realizar ninguna comparación pesada.Además, si cambia un poco la implementación de la función para tener que volver a crearla en un cambio de parámetro en particular, simplemente puede actualizar la implementación
useCallback
y agregar el parámetro adicional como dependencia. Sin embargo, si lo implementa con useRef, debe volver auseCallback
fuente
Porque la salida de useRef (() => {...}). Current es mutable.
Lo que puede causar efectos secundarios extraños en su código. Puedo cambiar el valor de la corriente en cualquier momento. https://codesandbox.io/s/confident-monad-vjeuw
Ese sería el caso de uso para no querer usar useRef
fuente
x = useRef(value).current
nunca devuelve una instancia mutable;ref
nunca se devuelve;current
es. Eso es lo mismo que con lauseCallback
versión.