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

472
Vistas
Obtención de datos usando useEffect() y useCallback In React

Tema

Estoy buscando la forma más óptima de obtener datos usando useEffect() cuando la función de obtención se usa en más de un lugar.

Situación

Actualmente, tengo un componente principal ( ItemContainer ) y un componente secundario ( SearchBar ). ItemContainer debe obtener toda la lista posible de elementos utilizando las funciones getItemList() . Estoy ejecutando esta función dentro de useEffect() durante el primer procesamiento, y también la paso al componente SearchBar , de modo que cuando un usuario envíe un término de búsqueda, actualizará el estado de itemList activando getItemList() en ItemContainer .

Esto realmente funciona tal como esperaba. Sin embargo, mi problema es que

  1. No estoy muy seguro de si está bien definir getItemList() fuera de useEffect() en este tipo de situación. Por lo que he estado leyendo (publicaciones de blog, documentos oficiales de reacción), generalmente se recomienda que la función de obtención de datos se defina dentro de useEffect() , aunque podría haber algunos casos extremos. Me pregunto si mi caso se aplica como este caso de borde.
  2. ¿Está bien dejar la matriz de dependencias vacía en useCallback ? Intenté completarlo usando searchTerm , itemList , pero ninguno de ellos funcionó, y estoy bastante confundido por qué es así.

Me siento mal porque no entiendo completamente el código que escribí. Agradecería si alguno de ustedes pudiera iluminarme con lo que me estoy perdiendo aquí...

ItemContainer

 const ItemContainer = () => { const [itemList, setItemList] = useState([]); const getItemList = useCallback( async (searchTerm) => { const itemListRes = await Api.getItems(searchTerm); setItemList(itemListRes) }, []); useEffect(() => { getItemList(); }, [getItemList]); return ( <main> <SearchBar search={getItemList} /> <ItemList itemList={itemList} /> </main> ) }

Barra de búsqueda

 const SearchBar = ({ search }) => { const [searchTerm, setSearchTerm] = useState(''); const handleSubmit = (e) => { e.preventDefault(); search(searchTerm); setSearchTerm(''); } const handleChange = (e) => { setSearchTerm(e.target.value) } return ( <form onSubmit={handleSubmit}> <input placeholder='Enter search term...' value={searchTerm} onChange={handleChange} /> <button>Search</button> </form> ) }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Aquí están mis respuestas.

  1. Sí, está bien. Lo que hay dentro de useCallback está "congelado" con respecto a las muchas llamadas a la función ItemConteiner que pueden ocurrir. Dado que el contenido de useCallback solo accede a setItemList , que también es un controlador congelado, no habrá problemas.

  2. Eso también es correcto, porque una matriz vacía significa "dependiente de nada". En otras palabras, la devolución de llamada se crea una vez y se mantiene congelada durante toda la vida del ItemContainer .

En cambio, esto es algo raro:

 useEffect(() => { getItemList(); }, [getItemList]);

Funciona, pero tiene muy poco sentido. El getItemList se crea una sola vez, entonces, ¿por qué hacer un useEffect dependiendo de que algo nunca cambie?

Hágalo más simple, ejecutando solo una vez:

 useEffect(() => { getItemList(); }, []);
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