Найти тему

Как создать ReactJS Modal Component

Оглавление

Всем Привет!

В этой статье разберем как создать простой компонент модального окна в React JS с нуля.

Если задать в поиске фразу - модальное окно для React JS, то можно найти огромное количество готовых библиотек. Так сказать - подключай и используй. Но, чтобы понять, как именно это работает, нужно хотя бы один раз написать компонент модального окна самостоятельно. В нашем случае это будет SimpleModal Component, но Вы можете назвать его по своему.

Если формат изложения материала в виде текста Вам не подходит, то можете посмотреть видео или скачайте готовый проект с github.com.

Github: https://github.com/DmitriyShkredov/react-simple-modal

В результате получим модальное окно, которое плавно открывается и закрывается, подстраивается под мобильный размер окна, и имеет вертикальный скрол, если текста слишком много.

Внешний вид модального окна
Внешний вид модального окна

Для удобства разделим процесс создания SimpleModal на отдельные шаги.

1. Создаем разметку:

Для начала создаем страницу, пускай это будет Header, Footer и Main компоненты. Также добавим кнопку для управления модальным окном.

Создаем отдельную папку для нового компонента. Здесь будем хранить все что относится к SimpleModal - разметка, стили и дополнительные функции. Таким образом компонент можно легко переиспользовать или перенести в другой проект.

Структура проекта
Структура проекта

Модальное окно состоит из нескольких вложенных блоков:

<div className="modal">

<div className="modal-wrapper">

<div className="modal-content">

<button className="modal-close-button">

<IconClose />

</button>

</div>

</div>

</div>

2. Стилизуем разметку:

Основной блок располагается фиксированно, на всю ширину и высоту экрана. Задаем полупрозрачный фон и скрол по оси Y.

.modal {

position: fixed;

top: 0;

left: 0;

width: 100%;

height: 100%;

background-color: rgba(0, 0, 0, 0.75);

overflow: hidden;

overflow-y: auto;

z-index: 999;

}

Блок modal-wrapper занимает всю ширину и высоту родителя, растягивается в высоту при необходимости, и располагает дочерний элемент в центре.

.modal-wrapper {

position: absolute;

top: 0;

left: 0;

display: flex;

justify-content: center;

align-items: center;

width: 100%;

min-height: 100%;

}

Блок modal-content - это белый блок, в который мы помещаем заголовок и текст.

.modal-content {

position: relative;

margin: 20px;

width: 100%;

max-width: 600px;

border-radius: 20px;

background-color: #ffffff;

padding: 40px 20px 20px 20px;

}

Кнопку для закрытия модального окна, modal-close-button, располагаем в верхнем правом углу и добавляем svg иконку крестик.

.modal-close-button {

position: absolute;

top: 16px;

right: 16px;

width: 30px;

height: 30px;

}

3. Передаем пропсы:

Переходим в Main.jsx. Для управления модальным окном создаем состояние modalIsOpen. При клике по кнопке изменяем состояние на true. Передаем isModalOpen и функцию onClose в SimpleModal. Передаем заголовок и текст.

Main.jsx
Main.jsx

4. Получаем пропсы и children:

Переходим в SimpleModal.jsx. Получаем пропсы: isOpen, onClose и children. Для плавного появления и скрытия используем Transition из библиотеки react-transition-group.

SimpleModal.jsx
SimpleModal.jsx

Для анимации появления добавляем transition и используем такие стили:

.modal {

transition: opacity 0.3s;

}

.modal-content {

transition: transform 0.3s;

}

.modal--entering, .modal--entered {

opacity: 1;

}

.modal--entering .modal-content, .modal--entered .modal-content {

transform: translateY(0);

}

.modal--exiting, .modal--exited {

opacity: 0;

}

.modal--exiting .modal-content, .modal--exited .modal-content {

transform: translateY(-50px);

}

Компонент готов к использованию.

5. Закрываем модальное окно по клику вне modal-content.

Чтобы закрыть окно по клику по серой области, напишем небольшую функцию onWrapperClick.

const onWrapperClick = (event) => {

if (event.target.classList.contains("modal-wrapper")) onClose();

};

Здесь мы получаем событие event, и определяем по какому элементу был совершен клик. Если это modal-wrapper, то закрываем модальное окно. Выполняем функцию onWrapperClick при событии onClick на элементе modal-wrapper.

<div className="modal-wrapper" onClick={onWrapperClick}>

-5

Таким образом модальное окно закрывается при клике по кнопке с крестиком или по серой области.

6. Добавляем несколько модальных окон на одну страницу.

Мы подошли к последнему разделу этой статьи. Переходим в Main.jsx и добавляем три состояния, три кнопки и три модальных окна с разным текстом.

Main.jsx - состояния и кнопки
Main.jsx - состояния и кнопки
Main.jsx - модальные окна с заголовками и текстом
Main.jsx - модальные окна с заголовками и текстом

Получаем три кнопки, каждая кнопка открывает свое модальное окно.

Выводы:

В этой статье приведен пример простейшего компонента модального окна в React JS. Но несмотря на свою простоту это полностью рабочий вариант, который можно использовать в реальных проектах.