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

Menu Item

Чтобы собрать menu нам необходимо создать интерактивный элемент который мы называем menu item. Он также собирается в коллекцию и походят на option list визуально, но не функционально. Главная задача menu item выводить пункты menu, возможно иметь иконку и навигировать пользователя внутри сервиса.

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

Menu Item может содержать в себе различные типы данных: иконку, текст, картинку, в зависимости от назначения. В данном примере рассматриваем вариант с иконкой и текстом. Все стили создаются в отдельном файле, чтобы придерживаться принципа проектирования компонента в изоляции.

Структура чипса

Состояние компонента

Так как menu item является малой функциональной частью структуры menu, в которую входит коллекция из menu item, мы выделяем только анимацию hover, при наведении на элемент списка.

Структура чипса Структура чипса

Реализация

Для начала в папке с компонентами создаем новую папку A_MenuItem, в неё кладем A_MenuItem.jsx и A_MenuItem.css. Затем описываем принимаемые атрибуты и icon из папки Q_Icon.

import classnames from 'classnames'
import React, { PureComponent } from 'react'
import './A_MenuItem.css'

export default class A_MenuItem extends PureComponent {
  constructor(props) {
    super(props)
  }

  render() {
    const { text, icon, url, active } = this.props

    const classes = classnames({
      A_MenuItem: true,
      active: active
    })

    const iconClasses = classnames({
      Q_Icon: true,
      [`${icon}`]: true
    })

    return (
      <a className={classes} href={url}>
        <div className={iconClasses}></div>
        {text}
      </a>
    )
  }
}

Затем прописываем стили для A_MenuItem и Q_Icon. Для icon задаем размеры контейнера и его позиционирование, в него будет рендериться svg заданная в menu иконка.

.A_MenuItem {
  display: flex;
  width: 304px;
  padding: 20px 40px;
  border-radius: 6px;
  font-size: 20px;
  font-weight: 300;
  color: #426060;
  cursor: pointer;
  align-items: center;
  text-decoration: none;
}

.A_MenuItem .Q_Icon {
  width: 35px;
  margin-right: 20px;
  height: 35px;
  cursor: pointer;
}

.A_MenuItem:hover {
  text-decoration: none;
  background-color: #dcffff;
}

Мы создали компонет, но описали только его функционал, теперь его нужно отрендерить. Попробуй теперь этот компонент вывести согласно своей структуре проекта. Ты можешь увидеть как это делаем мы, а также посмотреть получившийся menu item.

import React from 'react'
import ReactDOM from 'react-dom'
import A_MenuItem from '../../components/atoms/A_MenuItem/A_MenuItem.jsx'

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <A_MenuItem text={'Профиль'} icon={'user'} />,
    document.body
  )
})

Получаем следующий результат:

Структура чипса

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

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

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

Этот компонент часто выводится в следующих компонентах