Eliminar dependencias de los Efectos
Cuando escribes un Efecto, el linter verificará que has incluido todos los valores reactivos (como las props y el estado) que tu Efecto lee en la lista de dependencias de tu Efecto. Así se asegura que el Efecto se mantenga sincronizado con las últimas props y el último estado de tu componente. Dependencias innecesarias pueden ocasionar que tu Efecto se ejecute demasiadas veces, o incluso crear un ciclo infinito. Sigue esta guía para revisar y eliminar dependencias innecesarias de tus Efectos.
Aprenderás
- Cómo arreglar ciclos infinitos de dependencias de un Efecto
- Qué hacer cuando quieres eliminar una dependencia
- Cómo leer un valor en un Efecto sin “reaccionar” a él
- Cómo y por qué evitar objectos y funciones como dependencias
- Por qué suprimir la advertencia de la dependencia es peligroso, y qué hacer en su lugar
Las dependencias deben corresponderse con el código
Cuando escribes un Efecto, primero debes especificar como iniciar y parar lo que sea que tu Efecto está haciendo.
const serverUrl = 'https://localhost:1234';
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.connect();
return () => connection.disconnect();
// ...
}Entonces, si dejas la lista de dependencias del Efecto vacía ([]), el linter sugerirá las dependencias correctas:
import { useState, useEffect } from 'react'; import { createConnection } from './chat.js'; const serverUrl = 'https://localhost:1234'; function ChatRoom({ roomId }) { useEffect(() => { const connection = createConnection(serverUrl, roomId); connection.connect(); return () => connection.disconnect(); }, []); // <-- ¡Corrige el error aquí! return <h1>¡Bienvenido a la sala {roomId}!</h1>; } export default function App() { const [roomId, setRoomId] = useState('general'); return ( <> <label> Escoge la sala de chat:{' '} <select value={roomId} onChange={e => setRoomId(e.target.value)} > <option value="general">general</option> <option value="viaje">viaje</option> <option value="música">música</option> </select> </label> <hr /> <ChatRoom roomId={roomId} /> </> ); }
Llénalas de acuerdo a lo que dice el linter:
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]); // ✅ Todas las dependencias declaradas
// ...
}Los Efectos “reaccionan” a valores reactivos. Dado que roomId es un valor reactivo (puede cambiar debido a una nueva renderización), el linter verifica que lo hayas especificado como dependencia. Si roomId recibe un valor diferente, React volverá a sincronizar tu Efecto. Esto asegura que el chat permanece conectado a la sala seleccionada y “reacciona” al dropdown: