← Назад к вопросам
Как будет работать useEffect, если массив зависимостей пустой?
2.0 Middle🔥 231 комментариев
#React
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
useEffect с пустым массивом зависимостей
Основное поведение
Когда массив зависимостей пустой ([]), useEffect выполнится один раз — сразу после первого рендера компонента, когда компонент был примонтирован. Это отличается от других сценариев использования useEffect.
Различия в поведении useEffect
Важно различать три сценария:
// 1. БЕЗ массива зависимостей - запускается после КАЖДОГО рендера
useEffect(() => {
console.log('Запускается после КАЖДОГО рендера');
});
// 2. С ПУСТЫМ массивом зависимостей - запускается только при монтировании
useEffect(() => {
console.log('Запускается только один раз');
}, []);
// 3. С зависимостями - запускается, если зависимости изменились
useEffect(() => {
console.log('Запускается при изменении зависимостей');
}, [dependency]);
Практические примеры
Загрузка данных при монтировании
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// Эта функция запустится ровно один раз
const fetchUser = async () => {
try {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
setUser(data);
} finally {
setLoading(false);
}
};
fetchUser();
}, []);
if (loading) return <div>Загрузка...</div>;
return <div>{user.name}</div>;
}
Инициализация WebSocket соединения
function ChatComponent() {
useEffect(() => {
const socket = new WebSocket('ws://server');
socket.onopen = () => {
console.log('Соединение установлено');
};
return () => {
socket.close();
};
}, []);
return <div>Чат готов</div>;
}
Функция очистки (Cleanup)
Даже с пустым массивом зависимостей можно вернуть функцию очистки, которая запустится при размонтировании компонента:
useEffect(() => {
const timer = setInterval(() => {
console.log('Тик');
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
Частые ошибки
Ошибка 1: Забыл добавить пустой массив
// НЕПРАВИЛЬНО: запускается после КАЖДОГО рендера
useEffect(() => {
fetch('/api/data');
});
// ПРАВИЛЬНО: запускается один раз
useEffect(() => {
fetch('/api/data');
}, []);
Ошибка 2: Забыл про cleanup
// НЕПРАВИЛЬНО: утечка памяти
useEffect(() => {
window.addEventListener('resize', handleResize);
}, []);
// ПРАВИЛЬНО: удалить слушатель при размонтировании
useEffect(() => {
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
Жизненный цикл с пустым массивом
Эффект запускается после монтирования и cleanup вызывается при размонтировании, но не на каждый рендер.
Итог
С пустым массивом зависимостей useEffect идеален для:
- Инициализации состояния
- Загрузки данных при первом монтировании
- Установки слушателей событий с cleanup
- Подключения к WebSocket с cleanup
- Загрузки конфигурации приложения