Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

147
Visualizações
Guardando la respuesta de API en State usando useState y Axios (React JS)

Tengo un problema al intentar guardar en Estado una llamada a la API de axios. Probé el método useState set que no refleja el cambio inmediatamente en la respuesta y muchos otros y no puedo guardar el estado. Esto no es un duplicado, porque probé cuál es la respuesta aceptada y la siguiente y todavía no funciona. Aquí está el componente (bastante simple). Cualquier ayuda será apreciada

 export const Home = () => { const [widgets, setWidgets] = useState([]); useEffect(() => { axios .get('/call-to-api') .then((response) => { const data = response.data; console.log(data); // returns correctly filled array setWidgets(widgets, data); console.log(widgets); // returns '[]' }); }, []); // If I set 'widgets' here, my endpoint gets spammed return ( <Fragment> {/* {widgets.map((widget) => { // commented because it fails <div>{widget.name}</div>; })} */} </Fragment> ); };
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Bienvenido a stackoverflow, lo primero es lo primero: la llamada de configuración es incorrecta, debe usar el operador de distribución para combinar la matriz en una, así que cámbielo a setWidgets([...widgets, ...data]); sería correcto (supongo que tanto los widgets como data son Array)

segundo, el estado de reacción no cambiará sincrónicamente

 .then((response) => { const data = response.data; console.log(data); // returns correctly filled array setWidgets(widgets, data); console.log(widgets); // <--- this will output the old state since the setWidgets above won't do it's work till the next re-render

entonces, para escuchar el cambio de estado, debe usar useEffect hook

 useEffect(() => { console.log("Changed Widgets: ", widgets) }, [widgets])

esto registrará la consola cada vez que cambie el widget

el código completo se verá así

 export const Home = () => { const [widgets, setWidgets] = useState([]); useEffect(() => { axios .get('/call-to-api') .then((response) => { const data = response.data; setWidgets([...widgets, ...data]) }); }, []); useEffect(() => { console.log("Changed Widgets: ", widgets) }, [widgets]) return ( <Fragment> {/* {widgets.map((widget) => { // commented because it fails <div>{widget.name}</div>; })} */} </Fragment> ); };
about 4 years ago · Juan Pablo Isaza Relatório

0

Probar:

 setWidgets(data);

en lugar de

 setWidgets(widgets, data);
about 4 years ago · Juan Pablo Isaza Relatório

0

Su widgets.map() probablemente falla porque no hay mucho que mapear cuando se procesa el componente.

Debe actualizarlo con un condicional como este, solo para mayor claridad:

 widgets.length>0 ? widgets.map(...) : <div>No results</div>

Y su llamada a setWidgets() solo debe tomar un argumento, los datos:

 setWidgets(data)

o si desea fusionar las matrices, use un operador de distribución (pero luego debe agregar widgets como dependencia a la matriz de dependencia useEffect).

 setWidgets(...widgets, ...data)

Es posible que también deba proporcionar la función de enlace setWidgets a la matriz de dependencias useEffect.

Déjeme saber si esto ayuda..

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda