Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про React: modal, portal, event handling

Как реализовать модальное окно с формой (логин/пароль) и обработкой внешних кликов (outside click) для закрытия?

Вопрос проверяет умение создавать интерактивные UI-компоненты с обработкой событий и управлением состоянием в React.

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

Модальное окно реализуется как компонент, который отображается поверх основного контента. Обработка клика вне модалки (outside click) делается через проверку цели события: если клик был не по модалке, то закрываем ее.

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

Структура модального окна:

  • Компонент модалки рендерится в отдельном портале (например, в document.body) для избежания проблем с z-index.

  • Состояние видимости управляется через React-стейт.

Обработка outside click:

  • Добавляем обработчик клика на документ при открытии модалки.

  • В обработчике проверяем, был ли клик внутри модалки (используя ref).

  • Если клик был снаружи, закрываем модалку.

Пример реализации:

const Modal = ({ isOpen, onClose, children }) => {
  const modalRef = useRef();

  useEffect(() => {
    const handleClickOutside = (event) => {
      if (modalRef.current && !modalRef.current.contains(event.target)) {
        onClose();
      }
    };

    if (isOpen) {
      document.addEventListener('mousedown', handleClickOutside);
    }

    return () => {
      document.removeEventListener('mousedown', handleClickOutside);
    };
  }, [isOpen, onClose]);

  if (!isOpen) return null;

  return ReactDOM.createPortal(
    <div className="modal-overlay">
      <div ref={modalRef} className="modal-content">
        {children}
        <form>
          <input type="text" placeholder="Login" />
          <input type="password" placeholder="Password" />
          <button type="submit">Login</button>
        </form>
      </div>
    </div>,
    document.body
  );
};

Улучшения:

  • Добавление анимаций появления/исчезновения.

  • Обработка клавиши Escape для закрытия.

  • Блокировка скролла тела страницы при открытой модалке.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • React

    React

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

#modal

#portal

#event handling

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