Вопрос проверяет понимание типичных ошибок при использовании React-хуков, что важно для написания стабильного и предсказуемого кода.
React-хуки — мощный инструмент, но их неправильное использование может привести к трудноуловимым багам. Основные риски связаны с нарушением правил хуков, некорректными зависимостями и побочными эффектами. Понимание этих ошибок помогает писать более надёжные компоненты.
Хуки должны вызываться только на верхнем уровне компонента и не внутри условий, циклов или вложенных функций. Это гарантирует, что порядок вызовов хуков стабилен между рендерами. Если нарушить это правило, React может потерять состояние или вызвать ошибки.
// Плохо: вызов в условии
if (isVisible) {
useEffect(() => { ... });
}
// Хорошо: всегда вызывается
useEffect(() => { ... });
if (isVisible) { ... }Зависимости определяют, когда эффект перезапускается. Если указать неполный массив, эффект может использовать устаревшие значения (stale closure). Если указать слишком много зависимостей, эффект будет выполняться слишком часто. Важно включать все переменные, используемые внутри эффекта.
const [count, setCount] = useState(0);
useEffect(() => {
console.log(count); // count должен быть в зависимостях
}, []); // Ошибка: count не указанВызов setState прямо в теле компонента (не в обработчике события или эффекте) вызывает бесконечный цикл рендеринга. Это происходит потому, что каждый рендер вызывает обновление состояния, что приводит к новому рендеру.
// Плохо: вызов setState в рендере
const [value, setValue] = useState(0);
setValue(value + 1); // Бесконечный цикл
// Хорошо: в обработчике события
const handleClick = () => setValue(value + 1);Если в зависимостях указать объект или функцию, создаваемые каждый рендер, эффект будет выполняться на каждом рендере, так как ссылка меняется. Используйте useCallback или useMemo для стабилизации.
const fetchData = useCallback(() => { ... }, []);
useEffect(() => { fetchData(); }, [fetchData]);Эффекты, которые создают подписки, таймеры или слушатели, должны возвращать функцию очистки. Без неё возможны утечки памяти и ошибки при размонтировании компонента.
useEffect(() => {
const timer = setInterval(() => { ... }, 1000);
return () => clearInterval(timer); // Очистка
}, []);Избегайте этих ошибок, следуя правилам хуков, аккуратно управляя зависимостями и всегда очищая побочные эффекты. Это обеспечит стабильность и производительность ваших React-приложений.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию