Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: React, custom hook, event listener, useEffect, useRef

Как реализовать кастомный хук для работы с eventListener?

Этот вопрос проверяет умение создавать переиспользуемые хуки в React для управления побочными эффектами, такими как подписка на события браузера.

Короткий ответ

Кастомный хук для работы с eventListener позволяет централизованно управлять подпиской на события DOM. Он использует useEffect для добавления и удаления слушателя, а useRef — для сохранения стабильной ссылки на callback-функцию. Это предотвращает утечки памяти и обеспечивает правильную очистку при размонтировании компонента. Хук принимает тип события, обработчик и опциональный элемент-цель.

Длинный ответ

Кастомные хуки в React — это функции, которые инкапсулируют логику с состоянием и побочными эффектами для повторного использования. Хук для работы с eventListener — типичный пример, так как подписка на события браузера является побочным эффектом, требующим очистки.

Основная логика хука

Хук должен принимать три аргумента: тип события (например, 'click'), обработчик (callback-функцию) и опциональный элемент, к которому будет привязан слушатель (по умолчанию — объект window). Внутри хука используется useEffect для управления жизненным циклом подписки.

Ключевые аспекты реализации

  • Используйте useRef для сохранения обработчика. Это позволяет избежать повторной подписки при каждом рендере, если обработчик изменился.
  • В useEffect добавьте слушатель с помощью addEventListener.
  • Возвращаемая из useEffect функция очистки должна удалять слушатель с помощью removeEventListener.
  • Зависимости useEffect должны включать тип события и элемент-цель, чтобы хук реагировал на их изменения.

Пример кода

import { useEffect, useRef } from 'react';

function useEventListener(eventType, handler, element = window) {
  // Сохраняем обработчик в ref, чтобы он не вызывал эффект при каждом рендере
  const savedHandler = useRef();

  useEffect(() => {
    savedHandler.current = handler;
  }, [handler]);

  useEffect(() => {
    // Проверяем, поддерживает ли элемент addEventListener
    const isSupported = element && element.addEventListener;
    if (!isSupported) return;

    // Создаём обёртку, которая вызывает сохранённый обработчик
    const eventListener = (event) => savedHandler.current(event);

    // Добавляем слушатель
    element.addEventListener(eventType, eventListener);

    // Функция очистки: удаляем слушатель
    return () => {
      element.removeEventListener(eventType, eventListener);
    };
  }, [eventType, element]); // Эффект перезапускается при изменении типа или элемента
}

export default useEventListener;

Применение хука

Этот хук можно использовать в любом функциональном компоненте для подписки на события, такие как клики, прокрутка, изменение размера окна или клавиатурные события. Например, для отслеживания нажатия клавиши Escape:

function MyComponent() {
  const handleEscape = (event) => {
    if (event.key === 'Escape') {
      console.log('Escape pressed');
      // Закрыть модальное окно и т.д.
    }
  };

  useEventListener('keydown', handleEscape);

  return Нажмите Escape;
}

Вывод: Кастомный хук useEventListener полезен для централизации логики работы с событиями DOM, обеспечения правильной очистки и повышения переиспользуемости кода в React-приложениях.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#React

#custom hook

#event listener

#useEffect

#useRef

Подпишись на React Developer в телеграм