Tengo un componente Cart con react-redux y tengo un componente showProducts que obtiene los productos de una API (usando await-async) dentro de useEffect, y luego uso useState para establecer algunos de los estados y uso dispatch para actualizar redux estado también. Sigo recibiendo esta advertencia:
Warning: Cannot update a component (`Cart`) while rendering a different component (`ShowProducts`). To locate the bad setState() call inside `ShowProducts`, follow the stack trace as described in https://reactjs.org/link/setstate-in-render ShowProducts@http://localhost:3000/static/js/main.chunk.js:3099:73Tengo una página de tienda y en mi página de tienda tengo:
<Grid item xs container > <ShowProducts /> </Grid> <Grid item xs container direction="column"> <Cart /> </Grid>y en mis productos de espectáculo:
useEffect(async () => { await getData(); }, []); . dispatch(setShippingCosts); dispatch(setCompanyNam); . . . async function getData() { fetch( `url` ) .then((res) => res.json()) .then((data) => { . . . setProducts(...); setShippingCost(...); . }) .catch((error) => { setError(error); }); }y en mi carrito estoy usando el costo de envío que viene del componente mostrar productos. No estoy seguro de cómo solucionar esta advertencia, he estado buscando y aún no he encontrado una solución. qué tan seria es esta advertencia, y no estoy seguro de por qué la estoy recibiendo.
El problema es cuando un componente pone en cola una actualización en otro componente, mientras el primer componente se está procesando. ( Error: demasiado difícil de solucionar "No se puede actualizar un componente desde el interior del cuerpo de la función de un componente diferente". )
Problema :
Mientras ShowProducts se procesa, también envía una acción que hace que se ponga en cola una actualización en el carrito.
Arreglo :
Mueva el despacho dentro de useEffect.
Explicación :
Al usar este Hook, le dices a React que tu componente necesita hacer algo después del renderizado. React recordará la función que pasó (nos referiremos a ella como nuestro "efecto") y la llamará más tarde después de realizar las actualizaciones de DOM. ¿Qué hace useEffect?
El siguiente es un bolígrafo sandbox para demostrar el error y la solución. (Abra la consola en la esquina inferior derecha para ver la advertencia, puede comentar el envío en el renderizado y ver que la advertencia desaparece)
Tenga en cuenta que está utilizando useEffect async y se supone que solo debe sincronizarse. Leer aquí