Este error indica que algo dentro de nuestro componente está generando muchos pintados que pueden desembocar en un loop (bucle) infinito. Algunas de las razones por las que puede aparecer este error son las siguientes:
- Llamar a una función que actualiza el estado en el renderizado del componente.
function Counter() {
const [count, setCount] = useState(0)
// ❌ código incorrecto
// no debemos actualizar el estado de manera directa
setCount(count + 1)
return <div>{count}</div>
}
Lo que sucede en este ejemplo, es que al renderizarse el componente, se llama a la función setCount
para actualizar el estado. Una vez el estado es actualizado, se genera nuevamente un render del componente y se repite todo el proceso infinitas veces.
Una posible solución sería:
function Counter() {
// ✅ código correcto
// se pasa el valor inicial deseado en el `useState`
const [count, setCount] = useState(1)
return <div>{count}</div>
}
Llamar directamente a una función en un controlador de eventos.
function Counter() {
const [count, setCount] = useState(0)
// ❌ código incorrecto
//se ejecuta directamente la función `setCount` y provoca un renderizado infinito
return <div>
<p>Contador: {count}</p>
<button onClick={setCount(count + 1)}>Incrementar</button>
</div>
}
En este código, se está ejecutando la función setCount
que actualiza el estado en cada renderizado del componente, lo que provoca renderizaciones infinitas.
La manera correcta sería la siguiente:
function Counter() {
const [count, setCount] = useState(0)
// ✅ código correcto
// se pasa un callback al evento `onClick`
// esto evita que la función se ejecute en el renderizado
return <div>
<p>Contador: {count}</p>
<button onClick={() => setCount(count + 1)}>Incrementar</button>
</div>
}
Usar incorrectamente el Hook de useEffect
.
Al ver este ejemplo:
function Counter() {
const [count, setCount] = useState(0)
// ❌ código incorrecto
useEffect(() => {
setCounter(counter + 1)
}) // 👈️ no colocar el array de dependencias
return <div>{count}</div>
}
Lo que ocurre, es que al no colocar un array de dependencias en el hook de useEffect
, estamos provocando que el código que se encuentre dentro se ejecute en cada renderizado del componente. Al llamar al setCounter
y actualizar el estado, obtenemos nuevamente renderizaciones infinitas.
Para solucionarlo, podemos hacer lo siguiente:
function Counter() {
const [count, setCount] = useState(0)
// ✅ código correcto
// estamos indicando que sólo queremos que el código se ejecute una vez
useEffect(() => {
setCounter(counter + 1)
}, []) //colocamos un array de dependencias vacío.
return <div>{count}</div>
}
Estas son solo algunas de las posibles causas que podemos encontrar cuando nos topamos con este mensaje de error en el código. Si quieres complementar esta información, te recomendamos revisar las siguientes secciones:
- ¿Qué es el estado en React?
- ¿Qué son los hooks?
- ¿Qué hace el hook useState?
- ¿Qué hace el hook useEffect?
- ¿Cuáles son las reglas de los hooks en React?