Sincroniza tus componentes con el mundo exterior usando useEffect, dominando las dependencias y la limpieza.
Abrir esta lección en KodokonUn componente de React calcula JSX a partir de props y estado. Todo lo que quede fuera de ese ámbito -cambiar el título del documento, iniciar un temporizador, suscribirse a un evento del navegador- es un efecto secundario. useEffect ejecuta ese código después del renderizado, sin bloquear la visualización, y lo vuelve a sincronizar cuando ciertos valores cambian.
import { useEffect } from "react";
function CartTitle({ count }) {
useEffect(() => {
document.title = `Cart (${count})`;
}, [count]);
return <p>Items: {count}</p>;
}El array de dependencias controla la frecuencia con la que se ejecuta el efecto. [count]: el efecto se vuelve a ejecutar después de cada renderizado en el que count haya cambiado. []: el efecto se ejecuta una sola vez, tras el primer renderizado. Sin array: el efecto se vuelve a ejecutar después de cada renderizado, lo que rara vez es lo que quieres. Regla de oro: todo valor del componente usado dentro del efecto debe aparecer en el array.
import { useEffect, useState } from "react";
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const id = setInterval(() => {
setSeconds((s) => s + 1);
}, 1000);
return () => clearInterval(id);
}, []);
return <p>Elapsed: {seconds} s</p>;
}La función devuelta por el efecto es la función de limpieza. React la llama antes de cada nueva ejecución del efecto y, luego, una última vez cuando el componente se desmonta. Es lo que evita las fugas: temporizadores huérfanos, listeners acumulados, suscripciones que nunca se cancelan. Todo efecto que “abre” algo debe volver a cerrarlo.
useEffect(() => {
function onResize() {
setWidth(window.innerWidth);
}
window.addEventListener("resize", onResize);
return () => {
window.removeEventListener("resize", onResize);
};
}, []);useEffect(fn, []), ¿cuándo se ejecuta la función fn?userId pero su array de dependencias es []. ¿Cuál es el problema?