MUI в React и как его кастомизировать

MUI в React и как его кастомизировать

  • 2 октября
  • читать 20 мин
Владимир Шайтан
Владимир Шайтан Senior Full Stack Developer в UKEESS Software House, Преподаватель Компьютерной школы Hillel.
Кристина Димитрова
Кристина Димитрова Project Manager в Accumulator Digital Agency

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

Но если вы спросите меня об этом на более глубоком уровне, то я вам скажу, что создание пользовательских интерфейсов — это не просто добавление кнопок и полей. Это искусство, где каждая деталь должна гармонично сочетаться как в музыкальной симфонии, обеспечивая плавный пользовательский опыт. В библиотеке Material-UI уже заложены отличные инструменты, но настоящая магия начинается тогда, когда вы берёте стандартные компоненты и придаёте им индивидуальность.

А если серьёзно, то Material-UI (далее MUI) — это популярная библиотека компонентов для React, где можно создавать интерфейсы, соблюдая принципы Material Design. Сейчас объясню, что это и о чём.

Material Design — это язык дизайна, разработанный Google в 2014 году.

ОСНОВНЫЕ ПРИНЦИПЫ MATERIAL DESIGN

  1. Метафора чего-то физического (материального)
    Интерфейсы имитируют свойства реальных объектов, как будто это физические материалы. К примеру, поверхности имеют толщину, реагируют на свет и тень, создавая иллюзию трёхмерности.
  2. Смелые цвета и чёткая типография
    Используются яркие цвета, чёткий текст и простые формы для обеспечения чёткого и ясного взаимодействия с интерфейсом.
  3. Содержательные анимации
    Анимации помогают пользователям понять взаимосвязи между элементами интерфейса, объясняя происходящее на экране (переход от одного состояния интерфейса к другому).
  4. Иерархия и фокус внимания
    Важные элементы выделяются с помощью цвета, размера или местоположения, направляя внимание пользователя на основную информацию.
  5. Адаптивность
    Дизайн должен подстраиваться к разным размерам экранов, обеспечивая корректное отображение как на мобильных устройствах, так и на настольных компьютерах.

В этой статье мы рассмотрим, как сделать этот самый правильный пользовательский интерфейс с помощью двух разных, но мощных методов кастомизации: makeStyles и sx. Готовы поднять своё мастерство кастомизации на новый уровень? Тогда начнём!

ЧТО ТАКОЕ КАСТОМИЗАЦИЯ КОМПОНЕНТОВ MUI И ПОЧЕМУ ОНА НУЖНА?

MUI предоставляет обширную библиотеку готовых компонентов для React, которые уже стилизованы и удобны для использования из коробки. Однако в реальных проектах часто нужно адаптировать дизайн к уникальным требованиям интерфейса, требующих кастомизации этих компонентов.

Кастомизация компонентов MUI требуется для:

  • Унификации дизайна: каждый проект имеет свои требования к стилю, и кастомизация позволяет придерживаться брендбука или общего стиля приложения.
  • Улучшение UX: некоторые интерфейсные элементы могут потребовать специфических изменений для улучшения взаимодействия пользователя с интерфейсом.
  • Адаптация к различным платформам: в зависимости от целевой платформы компоненты могут потребовать разного вида или поведения (например, для мобильной версии).
  • Улучшение производительности: кастомизация позволяет исключать лишние стили и логику, что может положительно повлиять на производительность приложения.
  • Гибкость в разработке: позволяет быстро адаптировать компоненты под различные требования без необходимости создавать их с нуля, что ускоряет процесс разработки.
  • Поддержка доступности: кастомизация помогает внедрить элементы, соответствующие стандартам доступности (например, правильные отступления, контрасты, фокус).
  • Улучшение кода: позволяет создавать более чистый, поддерживаемый код, поскольку компоненты можно стандартизировать. Например, из-за переменных, что уменьшает шансы на дублирование стилей.
  • Повышение интеграции с другими библиотеками: упрощает использование сторонних инструментов, таких как анимации или посторонние UI-библиотеки, через расширенную кастомизацию.

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

MUI ПРЕДЛАГАЕТ ДВА ОСНОВНЫЕ СПОСОБЫ СТИЛИЗАЦИИ:

  • makeStyles — классический подход с использованием CSS-in-JS через хуки.
  • sx — новый API, который позволяет писать стили в формате JSX прямо в компоненте.

ПЕРВЫЙ ШАГ К КАСТОМИЗАЦИИ: MAKESTYLES — СИЛА JAVASCRIPT СТИЛЕЙ

makeStyles — это хук, предоставленный MUI, позволяющий создавать объект стилей и затем применять его к компонентам. Этот способ удобен, если вы желаете верно отделить логику стилей от логики компонента.

Представьте, что вы создаете уникальную кнопку для вашего проекта.Вот как это можно сделать с помощью makeStyles:

import React from 'react';
import { Button } from '@mui/material';
import { makeStyles } from '@mui/styles';

const useStyles = makeStyles({
    customButton: {
        backgroundColor: '#ff5722',  // Яскравий і запам'ятовуваний колір
        color: '#ffffff',
        '&:hover': {
            backgroundColor: '#e64a19',  // Легка інтерактивність при наведенні  },
        borderRadius: '50px',  // Заокруглені краї додають "дружелюбності"
        padding: '12px 24px',
        transition: 'all 0.3s ease',  // Плавний перехід
    },
});

const CustomButton = () => {
    const classes = useStyles();

    return (
        <Button className={classes.customButton}>
            Натисни мене!
        </Button>
    );
};

export default CustomButton;

КАК ЭТО РАБОТАЕТ

  • makeStyles создаёт объект с правилами CSS,
  • используя classes.customButton, мы передаём стили компонента MUI Button..  
  • стиль применяется с учётом динамических состояний, таких как hover.

С этой кнопкой мы создали не просто стандартный элемент, а элемент, который выглядит современно и вызывает желание нажать. Скругленные края, яркий цвет и плавные переходы делают кнопку привлекательной и интуитивно понятной.

Так что такого особенного в makeStyles?

  • Динамическая природа: нужно ли изменить стили в зависимости от пропсов? Легко! makeStyles позволяет использовать JavaScript для управления стилями в зависимости от состояния компонентов.
  • Чистота кода: стили вынесены отдельно от структуры компонента, что упрощает их поддержку и модификацию.

Но makeStyles — это не единственный путь. Познакомимся с более современным и интуитивным способом.

ДОБРО ПОЖАЛОВАТЬ К МИРУ SX: КАСТОМИЗАЦИЯ НИКОГДА НЕ БЫЛА ПРОЩЕ 

Из MUI версии 5 появилась новая возможность кастомизации компонентов – использование атрибута sx.

Это мощный инструмент, позволяющий описывать стили прямо в компоненте как объект JavaScript. Он сочетает удобство написания стилей inline с гибкостью и функциональностью CSS.

Создадим ту же кнопку, но уже с использованием sx:

import React from 'react';
import { Button } from '@mui/material';

const CustomButton = () => {
    return (
        <Button
            sx={{
                backgroundColor: '#ff5722',
                color: '#fff',
                '&:hover': {
                    backgroundColor: '#e64a19',
                },
                borderRadius: '50px',
                padding: '12px 24px',
                transition: 'all 0.3s ease',
            }}
        >
            Натисни мене!
        </Button>
    );
};

export default CustomButton;

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

Теперь нет необходимости создавать дополнительные переменные или классы. Все находится там, где и должно быть — прямо в JSX. Это делает работу более быстрой, а результат — более прозрачным.

Почему sx стал так популярен?

  • Лёгкость использования: это идеальный вариант для быстрой кастомизации, особенно когда нужно внести небольшие изменения «на ходу», или уже на проде, если уж говорить прямо :)
  • Тема под рукой: sx позволяет легко интегрировать тему вашего приложения, используя встроенные переменные, такие как отступы, цвета и другие элементы темы.

Секреты мощной кастомизации по sx и темам.

Предположим, у вас в проекте настроена тема, и вы хотите, чтобы ваш компонент динамически подстраивался под нее.Создадим кнопку, которая будет использовать цвета по вашей теме:

import React from 'react';
import { Button } from '@mui/material';
import { useTheme } from '@mui/material/styles';

const ThemedButton = () => {
    const theme = useTheme();

    return (
        <Button
            sx={{
                backgroundColor: theme.palette.primary.main,
                color: theme.palette.common.white,
                '&:hover': {
                    backgroundColor: theme.palette.primary.dark,
                },
                padding: theme.spacing(2),
                borderRadius: '4px',
            }}
        >
            Тематична кнопка
        </Button>
    );
};

export default ThemedButton;

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

ЧТО ВЫБЕРЕТЕ: makeStyles ИЛИ ВСЁ ЖЕ ТАКОЙ SX? КАК ВЫБРАТЬ?

ПРОИЗВОДИТЕЛЬНОСТЬ

  • sx имеет преимущество в производительности благодаря тому, что он компилирует стили непосредственно во время рендеринга компонентов, что уменьшает нагрузку на браузер. Это может быть важным фактором в больших проектах с многочисленными компонентами, где скорость рендеринга имеет значение.
  • makeStyles использует CSS-in-JS, что может создать определённый тираж при обработке стилей, особенно если вы часто меняете стили в больших компонентах.

КАСТОМИЗАЦИЯ

  • Если вам нужно создать сложные стили или использовать CSS-селекторы, makeStyles может оказаться более подходящим. Он позволяет вам применять логику стилизации, например, динамическую настройку стилей в зависимости от состояния компонента.
  • sx также поддерживает кастомизацию, но она больше подходит для простых стилей. Например, для быстрой настройки цветов, отступов или размеров компонентов использование sx будет проще и быстрее.

ЧИТАБЕЛЬНОСТЬ КОДА

  • Использование sx обычно делает код более читабельным, поскольку стили написаны непосредственно в компоненте, и вы видите их в контексте. Это особенно полезно для простых компонентов, где логика стилей не сложна.
  • makeStyles может привести к разделению стилей и логике компонента, что в некоторых случаях может усложнить понимание, как компоненты выглядят и ведут себя.

СОВМЕСТНОСТЬ С КЛАССИЧЕСКИМ CSS

  • Если ваш проект уже использует классические CSS-файлы или другие CSS-инструменты, makeStyles может быть лучшим выбором, поскольку вы сможете легче интегрировать стили из других источников.
  • sx хорошо работает в средах, где вы полностью используете MUI, но вам будет труднее интегрировать его с внешними стилями.

КОМБИНАЦИЯ ОБЕХ ПОДХОДОВ

  • В некоторых случаях можно объединить оба подхода. Например, вы можете использовать sx для основных стилей компонентов, а makeStyles для обработки более сложных стилей или условных стилей, где это необходимо. Это позволяет максимально использовать преимущества обоих методов, сохраняя при этом код чистым и понятным.

СОТРУДНИЧЕСТВО В КОМАНДЕ

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

ВЫВОД

Кастомизация — это не просто технический приём, а ключ к созданию уникального и функционального интерфейса, резонирующего с вашими пользователями.

Когда вы используете мощные инструменты, такие как makeStyles и sx, вы не только адаптируете компоненты к своим потребностям, но и создаёте эмоциональную связь с вашей аудиторией, а это в наше время на вес золота, потому что конкуренция не снижается, кстати.

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

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

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

До встречи в этом же месте и в то же время :)

Рекомендуем публикации по теме