useEffect y sincronización con el exterior
Entiende cuándo usar useEffect, qué dependencias necesita y por qué no debe convertirse en tu herramienta por defecto.
useEffect sirve para sincronizar tu componente con algo externo al render:
- una petición
- un
setInterval - un listener del navegador
- una librería externa
No está para “hacer cosas después de render” sin criterio.
Ejemplo básico
import { useEffect, useState } from 'react';
function WindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
function handleResize() {
setWidth(window.innerWidth);
}
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
return <p>Ancho: {width}</p>;
}
La función retornada es la limpieza del efecto.
Dependencias
useEffect(() => {
document.title = `Carrito (${count})`;
}, [count]);
Si count cambia, el efecto vuelve a ejecutarse.
Si usas valores dentro del efecto, normalmente deben estar en la lista de dependencias.
Cuándo NO necesitas useEffect
No lo uses para:
- derivar datos
- filtrar arrays
- ordenar valores
- construir strings
Eso se hace durante el render:
const visibleProducts = products.filter((p) => p.inStock);
No así:
useEffect(() => {
setVisibleProducts(products.filter((p) => p.inStock));
}, [products]);
Ese patrón suele crear estado duplicado innecesario.
Regla práctica
Pregunta correcta:
“¿Estoy sincronizando el componente con algo externo?”
Si la respuesta es no, probablemente no necesitas useEffect.
En la siguiente lección juntamos varias piezas: inputs, formularios y estado compartido entre componentes.