Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

150
Views
¿Deberíamos usar useCallback en cada controlador de función en React Functional Components?

digamos que tenemos los componentes como este

 const Example = () => { const [counter, setCounter] = useState(0); const increment = () => setCounter(counter => counter + 1); return ( <div> <Button onClick={increment} /> <div>{counter}</div> </div> ); }

Cuando pasé el controlador onClick como una función de flecha , mi eslint lanzó una advertencia:

 error JSX props should not use arrow functions react/jsx-no-bind

Como leí en una respuesta de esta publicación: https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions-or-bind#:~:text=Why%20you%20shouldn 't%20uso,%20función%20anterior%20es%20basura%20recolectada .

La respuesta corta es porque la función de flecha se recrea cada vez, lo que perjudicará el rendimiento. Una solución propuesta a partir de esta publicación es envolverse en un enlace useCallback , con una matriz vacía. Y cuando cambio a esto, la advertencia de eslint realmente desaparece.

 const Example = () => { const [counter, setCounter] = useState(0); const increment = useCallback(() => setCounter(counter => counter + 1), []); return ( <div> <Button onClick={increment} /> <div>{counter}</div> </div> ); }

Sin embargo, también hay otra opinión que dice que el uso excesivo de useCallback eventualmente ralentizará el rendimiento debido a los gastos generales de useCallback. Un ejemplo está aquí: https://kentcdodds.com/blog/usememo-and-usecallback

¿Esto me está confundiendo mucho? Entonces, para los componentes funcionales, cuando se trata de un controlador de funciones en línea, ¿debería simplemente escribir la función de flecha (ignorar el eslint) o siempre envolverla en un useCallback?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

En mi opinión, useCallback no es para el rendimiento. No puedo pensar en ninguna razón por la que definir una función sea realmente costoso. A diferencia de useMemo , useCallback simplemente memoriza la función y no la ejecuta.

Entonces, ¿cuándo debemos usarlo?

El caso de uso principal es evitar volver a ejecutar una función innecesariamente. Redefinir una función no es problemático, pero volver a ejecutarla en cada actualización de estado tiene errores y, a menudo, es peligroso.

TLDR; Solo use useCallback cuando la función deba estar dentro de la matriz de dependencia de useEffect

Hay dos casos en los que puedo pensar en este momento:

  1. Por ejemplo, una función es asíncrona y debemos ejecutarla cuando se haya cambiado alguna de las dependencias:
 const [data, setData] = useState([]); const [filter, setFilter] = useState({}); const fetchData = useCallback(async () => { const response = await fetchApi(filter); setData(response.data); }, [filter]); useEffect(() => { fetchData(); }, [fetchData]);

(Si la función no es asíncrona, podemos usar useEffect directamente sin usar useCallback )

Sin embargo, no es necesario envolverlo con useCallback cuando solo se ejecuta mediante la interacción del usuario:

 const [data, setData] = useState([]); const [filter, setFilter] = useState({}); const fetchData = async () => { const response = await fetchApi(filter); setData(response.data); }; return ( <button onClick={fetchData}>Fetch Data</button> );
  1. Cuándo debe pasar una propiedad de función a un componente de terceros:
 const onAwesomeLibarayLoaded = useCallback(() => { doSomething(state1, state2); }, [state1, state2]); <AwesomeLibrary onLoad={onAwesomeLibarayLoaded} />

Porque el componente AwesomeLibrary podría hacer algo como el ejemplo 1 con la función onLoad pasada:

 const AwesomeLibarary = ({onLoad}) => { useEffect(() => { // do something onLoad(); }, [onLoad]); };

Si está seguro de que no está dentro useEffect , entonces está bien, incluso si no usa useCallback .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!