Вступить в клуб →
средняявопросReact и управление состоянием

После нескольких переходов между страницами обработчик прокрутки срабатывает десять раз

function StickyHeader() {
  const [isCompact, setIsCompact] = useState(false);

  useEffect(() => {
    window.addEventListener('scroll', () => setIsCompact(window.scrollY > 80));
  }, []);

  return <header className={isCompact ? 'compact' : ''} />;
}

После десятка переходов между страницами прокрутка начинает подтормаживать, а в профайлере на одно событие вызывается множество обработчиков. В чём проблема?

  • Эффект не снимает подписку — каждое монтирование добавляет новый обработчик
  • addEventListener нельзя вызывать внутри useEffect
  • Пустой массив зависимостей запускает эффект на каждом рендере
  • Событие scroll всплывает и вызывает обработчики всех компонентов

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела