Одно из самых популярных решений CSS-in-JS — это styled-components, и одной из его потрясающих функций является возможность легко создавать темы для ваших приложений React. Существует много способов работы с темами, и в этой статье я поделюсь своим методом, который основан на создании повторно используемых вспомогательных функций, чтобы упростить процесс и уменьшить объем кода, задействованного в стилях. Мы также коснемся использования полированной библиотеки, чтобы добавить изюминку и дополнительную функциональность в тему styled-components.

Моя мотивация для этого шаблона заключалась в том, чтобы добиться той же простоты, которую предлагают Sass и Stylus для написания функционального CSS; Я считаю, что комбинация styled-components и polished очень близка.

Репозиторий проекта доступен по адресу https://github.com/garethpbk/styled-components-theming.git.

Настройка проекта и темы

Настройте новый проект create-react-app и добавьте зависимости (или добавьте в существующий проект) — продолжайте и удалите все, кроме App.js и index.js, в /src:

Темы styled-components работают с Context API через компонент <ThemeProvider />. В index.js импортируйте компонент и тему и оберните <App />:

<ThemeProvider /> принимает одну опору, объект с именем theme; создайте файл theme.js, который был импортирован, и настройте значения:

Давайте используем цвета и размеры нашей темы в <App /> в стилизованном компоненте:

Хм. Синтаксис какой-то… громоздкий — мы каждый раз используем имя свойства объекта темы реквизита. Как мы можем упростить это?

Создание вспомогательных функций

Функции в помощь! Давайте создадим несколько повторно используемых вспомогательных функций, чтобы упростить доступ к значениям темы. В theme.js:

Теперь мы можем импортировать и использовать эту функцию в любое время, когда нам нужен цвет в стилизованном компоненте:

Проделаем то же самое с размерами:

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

Пицца с полировкой

Наконец, давайте воспользуемся некоторыми функциями polished через вспомогательные функции в theme.js:

В <App /> давайте применим это к новому стилизованному компоненту:

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

Почему мы не можем просто импортировать lighten прямо в компонент? Попробуй - ${lighten(getColor('secondary'), '0.2')} - неправильно анализируется. Сохранение его в теме означает, что он импортируется из polished только один раз и не зависит от наличия прямого доступа к getColor в компоненте.

Еще один — давайте воспользуемся функцией rgba из полированного для легко управляемых теней текста:

rgba автоматически преобразует шестнадцатеричные значения в значения rgb (точно так же, как одноименная функция Sass). Это здорово, потому что это означает, что нам не нужно повторно объявлять значения цвета в разных форматах; наличие параметров по умолчанию также является хорошим инструментом для установки базовых значений. Добавить к <Content />:

Это завершает мой метод создания тем styled-components; функции делают мощную, бесконечно расширяемую систему. В примере проекта вы также найдете простой компонент сетки, созданный со значениями точки останова в теме.