Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
Confundido sobre el extraño rendimiento de useMemo Hook en React

Este es mi propio gancho que se usa para realizar debounce en React Hooks

 import { useMemo, useRef } from "react"; import { debounce } from "lodash"; export function useDebounceFn(fn, wait) { const fnRef = useRef(fn) fnRef.current = () => { debugger fn() } const debounceFn = useMemo(() => { // Case One: can get the newest fn everytime return debounce(() => { fnRef.current() }); // Case Two: only can get the first fn return debounce(fnRef.current); }, []); return { run: debounceFn, cancel: debounceFn.cancel, } }

Creo que debounce(fnRef.current) es igual a debounce(() => { fnRef.current() }) , pero la verdad es que son diferentes y me pregunto por qué. ¿Hay algún problema con mi código o simplemente useMemo para hacer algo diferente en estos dos casos?

 const { run } = useDebounceFn(() => { console.log("num", num); }); useEffect(() => { run(); }, [num]);

Cuando uso el caso uno, puedo obtener el número más num y esto es lo que quiero darme cuenta, pero cuando uso el caso dos, cada run la función de ejecución solo puede obtener el num . Quiero saber por qué el caso dos solo puede obtener el valor inicial, en otras palabras, por qué el caso uno siempre puede obtener el valor más nuevo en useMemo .

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Creo que debounce(fnRef.current) es igual a debounce(() => { fnRef.current() }) , pero la verdad es que son diferentes y me pregunto por qué.

  • El caso 1 devuelve una función memorizada que llama a una función que obtiene el valor de referencia actual y lo invoca. Cuando se invoca la función run devuelta, el valor de referencia actual se "desempaqueta".
  • El caso 2 cierra sobre el valor de referencia inicial en la función antirrebote decorada. Nunca se actualizará durante la vida útil del componente.

Puede solucionar el caso 2 completando la matriz de dependencias del gancho useMemo para volver a encerrar el valor de referencia actual.

Ejemplo:

 export function useDebounceFn(fn, wait) { const fnRef = useRef(fn); const debounceFn = useMemo(() => { // Re-"cache" the function fnRef.current = () => { debugger fn() } // Re-decorate with debounce HOF return debounce(fnRef.current); }, [fn]); return { run: debounceFn, cancel: debounceFn.cancel, } }

Por cierto, para el caso 1, debe usar un gancho useEffect para establecer el valor de referencia cuando se actualice fn .

Ejemplo:

 export function useDebounceFn(fn, wait) { const fnRef = useRef(fn); useEffect(() => { fnRef.current = () => { debugger fn(); } }, [fn]); const debounceFn = useMemo(() => { return debounce(() => { fnRef.current(); }); }, []); return { run: debounceFn, cancel: debounceFn.cancel, } }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda