Введение Струтура компонента Состояние компонента Реализация Ссылки

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 с библиотекой компонентов.

Составляющие

В этот компонент часто выводятся следующие компоненты.