React Hooks
El Hook useEffect
useEffect Hook ### ### Introducción ### El Hook useEffect
permite manejar efectos secundarios en componentes funcionales. Un efecto secundario es cualquier operación que afecta algo fuera del ámbito de la función que está ejecutándose: peticiones a una API, suscripciones, cambios manuales en el DOM, etc. ### Sintaxis básica ### useEffect
se invoca dentro del componente funcional y permite realizar un efecto secundario. javascript import React, { useState, useEffect } from 'react'; function ExampleComponent() { const [count, setCount] = useState(0); // Similar a componentDidMount y componentDidUpdate: useEffect(() => { // Actualiza el título del documento usando la API del navegdor document.title = `Has hecho clic ${count} veces`; }); return ( <div> <p>Has hecho clic {count} veces</p> <button onClick={() => setCount(count + 1)}> Haz clic aquí </button> </div> ); }
### Descripción del ejemplo ### En este ejemplo: - useEffect
se llama después de renderizar el componente. En cada renderización, document.title
será actualizado reflejando el número de clics. ### Cleanup en useEffect ### Para limpiar efectos (como anular suscripciones o temporizadores), useEffect
puede retornar una función. javascript import React, { useState, useEffect } from 'react'; function Timer() { const [seconds, setSeconds] = useState(0); useEffect(() => { const interval = setInterval(() => { setSeconds(s => s + 1); }, 1000); return () => clearInterval(interval); // Cleanup el intervalo en el desmontaje o en la siguiente ejecución de `useEffect` }, []); return <div>Segundos: {seconds}</div>; }
En este ejemplo, creamos un temporizador que se incrementa cada segundo. Cuando el componente se desmonta o antes de que se vuelva a ejecutar el efecto, el intervalo se limpiará con clearInterval
. ### Dependencias del efecto ### Puedes controlar cuándo se activan los efectos pasando un array de dependencias como segundo argumento a useEffect
. javascript import React, { useState, useEffect } from 'react'; function AlertComponent() { const [count, setCount] = useState(0); const [alertCount, setAlertCount] = useState(0); useEffect(() => { setAlertCount(alertCount + 1); // Solo se ejecutará cuando `alertCount` cambie }, [alertCount]); return ( <div> <p>Has hecho clic {count} veces</p> <button onClick={() => setCount(count + 1)}> Haz clic aquí </button> <p>Alert count: {alertCount}</p> <button onClick={() => setAlertCount(alertCount + 1)}> Incrementar Alert Count </button> </div> ); }
En este ejemplo, useEffect
solo se ejecuta cuando alertCount
cambia, a diferencia de ejecutarse después de cada renderización. ### Cuando pasa un array vacío ### Pasar un array vacío []
como segundo argumento hace que el efecto solo se ejecute una vez, similar a componentDidMount
. javascript useEffect(() => { // Lógica para ejecutar una vez durante el montaje }, []);
[Placeholder para imagen sobre el flujo de trabajo de useEffect: Diagrama que muestra cómo se ejecutan efectos después de cada render, cleaned up antes de que se apliquetes efectos nuevamente, y cómo el array de dependencias afecta este comportamiento.]
Pregúntame lo que sea