¿Qué controla realmente el array de dependencias de useEffect?
Le dice a React qué valores lee el efecto, así el efecto vuelve a correr solo cuando uno de ellos cambia. Un array vacío significa correr una vez después del montaje; omitir el array por completo significa correr después de cada render, que es cómo empiezan los loops infinitos. Dejar afuera un valor usado es el otro fallo — el efecto cierra sobre un valor obsoleto y lo sigue usando para siempre.