Popup
Popup мы называем всплывающее модальное окно, с которым пользователь должен обязательно как либо провзаимодействовать. Он может его или закрыть или сделать действие, которое предлагает popup. Этот компонент выступает в роли обёртки в которую мы заворачиваем такие компоненты как alert и sing in.
Структура компонента
Popup состоит из поля, которое перекрывает экран и самой модальной области с контентом. Еще используем для примера кнопку, которая собственно и вызывает popup. Вот как это выглядит.
На экране мы видим кнопку button при нажатии на которую появляется popup.
Внутри popup состоит из header, в него входит заголовок и кнопка закрытия окна в виде icon, а также пустая область в которую передаём необходимый контент.
Состояние компонента
Popup или закрыт или открыт. Мы добавляем кнопку только для того, чтобы показать принцип работы popup, так он может вызываться при любом пользовательском действии и как информационное окно и как функциональное.
Реализация
Для начала в папке проекта создаём новую, в неё кладем файлы S_Popup.jsx и S_Popup.css. Затем описываем функционал popup и его структуру. Получаем следующий код.
import React, { PureComponent } from 'react'
import A_Button from '../../atoms/A_Button/A_Button.jsx'
import './S_Popup.css'
import '../../quarks/Q_Icon.css'
export default class S_Popup extends PureComponent {
constructor(props) {
super(props)
this.state = {
showPopup: false
}
this.openPopup = this.openPopup.bind(this)
this.closePopup = this.closePopup.bind(this)
}
openPopup() {
this.setState((prevState) => ({
...prevState,
showPopup: true
}))
}
closePopup() {
this.setState((prevState) => ({
...prevState,
showPopup: false
}))
}
render() {
const { showPopup } = this.state
const { popupButtonText, popupTitle, children } = this.props
return (
<div className="S_Popup">
<A_Button text={popupButtonText} handleClick={this.openPopup} />
{showPopup && (
<div className="W_PopupBackground">
<div className="W_PopupBox">
<div className="W_PopupBoxHeader">
<h3>{popupTitle}</h3>
<div className="Q_Icon close" onClick={this.closePopup}></div>
</div>
{children}
</div>
</div>
)}
</div>
)
}
}
Затем, в файле S_Popup.css прописываем стили для всех структур popup, в основном это обёртки, которые помогают правильно выстроить структуру не перегружая её компонентами.
.S_Popup {
position: relative;
width: 200px;
margin: 20% auto;
}
.S_Popup .W_PopupBackground {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: fixed;
display: flex;
justify-content: center;
align-items: center;
}
.S_Popup .W_PopupBox {
width: 610px;
height: 298px;
padding: 20px;
background-color: white;
display: flex;
flex-direction: column;
box-shadow: 9px 9px 35px rgba(0, 0, 0, 0.09);
border-radius: 10px;
}
.S_Popup .W_PopupBoxHeader {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
align-items: center;
}
.S_Popup .W_PopupBoxHeader h3 {
margin: 0;
font-size: 20px;
font-weight: 600;
color: #495151;
}
.S_Popup .W_PopupBoxHeader .Q_Icon.close {
width: 35px;
height: 35px;
cursor: pointer;
}
Мы создали компонент, но описали только его функционал, теперь его нужно отрендерить. Можешь вывести получившийся компонент согласно своей структуре проекта. Ты можешь увидеть как это делаем мы, а также посмотреть получившийся popup.
import React from 'react'
import ReactDOM from 'react-dom'
import S_Popup from '../../components/superorganisms/S_Popup/S_Popup.jsx'
document.addEventListener('DOMContentLoaded', () => {
ReactDOM.render(
<S_Popup popupButtonText="Открыть попап" popupTitle="Заголовок" />,
document.body
)
})
Получаем следующий результат.
Ссылки
Также для тебя ссылки на Figma с дизайн системой и GitHub с библиотекой компонентов.
Составляющие
В этот компонент часто выводятся следующие компоненты.