0Pricing
React Academy · Урок

Создание модального компонента с порталами

Создайте повторно используемое модальное окно, отображаемое в document.body через createPortal

«Создание модального компонента с порталами» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

На этом уроке Вы создадите переиспользуемый компонент Modal, который использует React.createPortal для отрисовки в document.body и поддерживает закрытие по нажатию на фон и клавише Escape.

Каркас компонента модального окна

Начните с базовой структуры: компонент Modal, принимающий свойства `isOpen`, `onClose` и `children`. Если `isOpen` имеет значение false, ничего не отрисовывайте.
function Modal({ isOpen, onClose, children }) {
  if (!isOpen) return null;
  return createPortal(
    <div className="backdrop" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()}>
        {children}
      </div>
    </div>,
    document.body
  );
}

Фон и остановка всплытия

Внешний элемент `backdrop` div занимает весь экран. При нажатии на него вызывается `onClose`. Внутренний элемент `modal` div вызывает `e.stopPropagation()`, поэтому нажатия внутри модального окна не всплывают к фону и случайно не закрывают его.

Закрытие клавишей Escape

Добавьте `useEffect`, который прослушивает событие `keydown`. Когда нажата клавиша Escape и модальное окно открыто, вызовите `onClose`. При очистке удалите обработчик.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Предотвращение прокрутки страницы

Когда модальное окно открыто, обычно нужно запретить прокрутку страницы позади него. Внутри `useEffect` добавляйте и удаляйте `overflow: hidden` у `document.body`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

Базовый CSS для модального окна

Фон должен быть неподвижным полноэкранным слоем. Блок модального окна следует разместить по центру. Минимальный подход на CSS использует flexbox у фона для центрирования модального окна.
.backdrop {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
}
.modal {
  background: white;
  border-radius: 8px;
  padding: 24px;
  min-width: 320px;
}

Использование модального окна

Управляйте модальным окном с помощью логической переменной состояния в родителе. Передавайте компоненту Modal свойства `isOpen` и `onClose`. Любое содержимое помещайте в `children`.
function App() {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button onClick={() => setOpen(true)}>Open Modal</button>
      <Modal isOpen={open} onClose={() => setOpen(false)}>
        <h2>Hello from the modal!</h2>
        <button onClick={() => setOpen(false)}>Close</button>
      </Modal>
    </>
  );
}

Добавление кнопки закрытия внутри

Всегда добавляйте внутри модального окна явную кнопку закрытия для пользователей, которые не могут пользоваться клавиатурой или не замечают фон. Передавайте `onClose` содержимому через children или свойство.

Анимация с переходами CSS

Для эффекта плавного появления вместо возврата null в закрытом состоянии всегда отрисовывайте портал, но переключайте CSS-класс. Используйте переходы CSS для `opacity` и `transform` у фона.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Составной заголовок и подвал модального окна

Разделите модальное окно на подкомпоненты: `Modal.Header`, `Modal.Body`, `Modal.Footer`. Используйте шаблон составного компонента, чтобы потребители могли составлять макет модального окна, не зная имён классов.

Быстрая проверка

Зачем мы вызываем e.stopPropagation() в обработчике onClick внутреннего элемента modal div?

Итоги

Вы создали Modal с помощью createPortal: нажатие на фон закрывает окно, клавиша Escape также закрывает его, прокрутка страницы блокируется, пока окно открыто, а stopPropagation не даёт нажатиям внутри окна закрыть его.

Далее

Следующий урок: **Обработка фокуса и ловушки клавиатуры в модальных окнах** — Вы удержите фокус внутри открытого модального окна, чтобы обеспечить требования доступности.

Часто задаваемые вопросы

Урок «Создание модального компонента с порталами» бесплатный?

Да — полный текст урока «Создание модального компонента с порталами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание модального компонента с порталами»?

Создайте повторно используемое модальное окно, отображаемое в document.body через createPortal Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Создание модального компонента с порталами»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что такое React Portals
  2. Создание модального компонента с порталами
  3. Управление фокусом и клавиатурные ловушки в модальных окнах
  4. Всплывающие подсказки и раскрывающиеся меню с порталами
← Назад к React Academy