useEffect: dependencias, cleanup y prevención de fugas

Aprende a modelar correctamente dependencias y funciones de limpieza para evitar efectos duplicados, fugas de memoria y datos obsoletos.

Cuando un componente interactúa con suscripciones, intervalos o listeners globales, no basta con montar el efecto: también hay que desmontarlo correctamente.

La función de limpieza de useEffect evita fugas y comportamientos duplicados al salir del componente o al cambiar dependencias.

Un error muy habitual es dejar arrays de dependencias incompletos para 'callar warnings', generando estados desincronizados difíciles de depurar.

La regla profesional es clara: declara todas las dependencias reales y simplifica la lógica cuando el effect se vuelve difícil de mantener.

  • React ejecuta la limpieza antes de volver a ejecutar el effect y también al desmontar el componente.
  • Si creas un `setInterval`, debes limpiarlo con `clearInterval` para evitar timers activos después de salir de la vista.
  • Si registras `window.addEventListener`, debes removerlo con `removeEventListener` en cleanup.
  • Esta simetría montar/desmontar es clave para componentes estables en producción.
  • El array no es una optimización manual, es una declaración de qué valores usa tu effect.

Qué hace exactamente el cleanup

React ejecuta la limpieza antes de volver a ejecutar el effect y también al desmontar el componente.

Si creas un `setInterval`, debes limpiarlo con `clearInterval` para evitar timers activos después de salir de la vista.

Si registras `window.addEventListener`, debes removerlo con `removeEventListener` en cleanup.

Esta simetría montar/desmontar es clave para componentes estables en producción.

Dependencias: contrato de sincronización

El array no es una optimización manual, es una declaración de qué valores usa tu effect.

Estrategia cuando el effect crece demasiado

Si un effect acumula muchas ramas y dependencias, suele indicar falta de separación de responsabilidades.

Un effect pequeño y específico se depura más rápido y minimiza efectos colaterales.

La limpieza explícita es parte del diseño, no un añadido al final.

  • Divide effects por responsabilidad (red, listeners, analytics...).
  • Extrae lógica a funciones o custom hooks.
  • Evita mezclar sincronización externa con cálculos de render.
  • Prioriza claridad sobre micro-optimizaciones tempranas.
React
08

useEffect: dependencias, cleanup y prevención de fugas

Aprende a modelar correctamente dependencias y funciones de limpieza para evitar efectos duplicados, fugas de memoria y datos obsoletos.

Código del tema: useEffect(() => { /* sync */ }, []);

📘 Teoría

Qué hace exactamente el cleanup

React ejecuta la limpieza antes de volver a ejecutar el effect y también al desmontar el componente.

1

Si creas un `setInterval`, debes limpiarlo con `clearInterval` para evitar timers activos después de salir de la vista.

2

Si registras `window.addEventListener`, debes removerlo con `removeEventListener` en cleanup.

3

Esta simetría montar/desmontar es clave para componentes estables en producción.

Dependencias: contrato de sincronización

El array no es una optimización manual, es una declaración de qué valores usa tu effect.

Effect con cleanup correcto
import { useEffect } from 'react';

function ResizeWatcher() {
  useEffect(() => {
    const onResize = () => console.log(window.innerWidth);

    window.addEventListener('resize', onResize);

    return () => {
      window.removeEventListener('resize', onResize);
    };
  }, []);

  return <p>Observando ancho de ventana</p>;
}

Estrategia cuando el effect crece demasiado

Si un effect acumula muchas ramas y dependencias, suele indicar falta de separación de responsabilidades.

Un effect pequeño y específico se depura más rápido y minimiza efectos colaterales.

La limpieza explícita es parte del diseño, no un añadido al final.

  • Divide effects por responsabilidad (red, listeners, analytics...).
  • Extrae lógica a funciones o custom hooks.
  • Evita mezclar sincronización externa con cálculos de render.
  • Prioriza claridad sobre micro-optimizaciones tempranas.

🧪 Aprende probando

Ejemplo Ejemplo: reloj con interval y cleanup Caso típico donde olvidar cleanup provoca múltiples intervalos acumulados.

🏁 Retos

Reto Reto: añade limpieza al listener Completa el effect para eliminar el listener de scroll al desmontar.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre React.

Test de React

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .