Найти тему
Nuances of programming

Знакомство с библиотекой Styled Components в React

Оглавление

Источник: Nuances of Programming

Styled Components  —  общеизвестная библиотека для стилизации приложений React. Она позволяет создавать пользовательские компоненты посредством написания самого CSS в JavaScript.

В статье будут рассмотрены принципы применения Styled Components в приложении React.

По итогам изучения материала вы узнаете, как:

  • создать стилизованный компонент;
  • передать ему свойства;
  • создать и работать с темой.

Начнем с беглого обзора библиотеки и ее преимуществ, а потом займемся разбором кода.

Styled Components

Для стилизации приложения React существует множество вариантов. Традиционно создается внешний файл CSS, после чего атрибуты в виде строки передаются свойству className.

Кроме того, можно воспользоваться техникой CSS-in-JS, которая предусматривает написание CSS в файле JavaScript. И Styled Components предполагает как раз данный подход.

“Используйте лучшие наработки ES6 и CSS для комфортной стилизации приложений”. (Цитата с сайта Styled Components).

Преимущества Styled Components

  • Автоматическая генерация критического CSS. Библиотека отслеживает компоненты, отображаемые на странице, и добавляет только их стили.
  • Отсутствие ошибок в именах класса. Она создает уникальное имя класса для стилей.
  • Упрощенное удаление CSS. Стили прикрепляются к определенному компоненту, а не добавляются как имя класса.
  • Простая динамическая стилизация. Стили присоединяются на основе свойств или темы.
  • Удобное обслуживание. Добавление стилей происходит не в разных файлах, а в одном месте.
  • Автоматическое применение вендорных префиксов. Styled Components берет все в свои руки.

Создание стилизованного компонента

Для начала создадим первый стилизованный компонент. В качестве базового проекта задействуем create-react-app с поддержкой TypeScript. Вы же можете параллельно работать как с ним, так и без него.

Как правило, в Styled Components файлу присваивается имя componentName.styled.ts, в котором вместо “componentName” указывается имя компонента.

Например, создадим компонент <Button> в новом файле /src/components/styles/Button.styled.ts, в котором начнем с import styled from 'styled-components';. После этого мы сможем воспользоваться styled для создания стилизованного компонента.

“В Styled Components для стилизации компонентов применяются теговые шаблонные литералы”. (Цитата с сайта библиотеки).

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

Сначала вводим styled., за которым указываем корректный компонент React или имя тега, например ‘div’. В данном случае это будет стилизованный компонент Button:

export const Button = styled.button`
background-color: springGreen;
color: black;
font-size: 16px;
border-radius: 4px;
padding: 0.5rem 1rem;
margin: 1rem;
cursor: pointer;
border: none;
outline: none
`;

Теперь можно задействовать компонент Button, как любой обычный элемент <button> в приложении.

<Button>Styled Button</Button>

При отрисовке кнопки все стили остаются с ней.

-2

Вы можете вложить правила, добавить медиа-запросы и псевдоклассы для определения конкретного состояния элемента. Например, добавим в компонент Button псевдокласс :hover, как показано ниже:

export const Button = styled.button`
background-color: springGreen;
color: black;
font-size: 16px;
border-radius: 4px;
padding: 0.5rem 1rem;
margin: 1rem;
cursor: pointer;
border: none;
outline: none
&:hover {
background-color: green;
color: white;
}
`;

Теперь наведение курсора на кнопку приведет к соответствующим изменениям цветов фона и текста надписи.

-3

Передача свойств стилизованному компоненту

В стилизованные компоненты также передаются свойства. Вы можете передать любое из них в компонент Button и там получить к нему доступ.

Например, передадим Button свойство bgcolor="springGreen" и в файле Button.styled.ts получим к нему доступ.

background-color: ${props => props.bgcolor};

Если у вас JavaScript, то все сработает отлично. Но в случае с TypeScript возникнет ошибка.

-4

Исправить эту ошибку поможет создание интерфейса для компонента Button. В нем вы можете определить свойства, передаваемые в Button.

interface ButtonProps {
bgcolor: string;
}

Затем передаем данный интерфейс в компонент Button и получаем доступ к свойству bgcolor. При этом TypeScript не сигнализирует об ошибке.

export const Button = styled.button<ButtonProps>`
background-color: ${props => props.bgcolor};
...other styles
`;

С помощью деструктуризации немного почистим код.

export const Button = styled.button<ButtonProps>`
background-color: ${({ bgcolor }) => bgcolor};
...other styles
`;

Создание и применение темы

Styled Components также позволяет создать глобальную тему (theme) для хранения различных значений, к которым нужно получить доступ в любом стилизованном компоненте.

Например, в компоненте Button вместо передачи свойства каждой используемой кнопке мы получаем доступ к значению из темы.

Для работы с ней необходимо обернуть приложение с помощью <ThemeProvider>.

В файле App.tsx выполняем import { ThemeProvider } from 'styled-components'. Затем оборачиваем все приложение с помощью ThemeProvider, который принимает одно свойство theme.

function App() {
return (
<ThemeProvider theme={theme}>
<div className="App">
<Button>Styled Button</Button>
</div>
</ThemeProvider>
);
}

Свойство theme принимает объект, который определяет, как будет выглядеть props.theme.

Например, создаем отдельный файл src/styles/theme.ts, а в нем  —  объект theme.

export const theme = {
color: {
primary: 'springGreen',
},
};

Затем, вернувшись в компонент Button.styled.ts, обновляем Button. Вместо обращения к ранее переданному свойству bgcolor можно получить цвет (color) из theme.

export const Button = styled.button`
background-color: ${props => props.theme.color.primary};
...other styles
`;

И вновь, прибегнув к деструктуризации, немного почистим код.

export const Button = styled.button`
background-color: ${({ theme }) => theme.color.primary};
...other styles
`;

Теперь значение theme.color.primary можно задействовать в любом созданном стилизованном компоненте. Если в дальнейшем мы решим изменить основной цвет, то потребуется лишь обновить тему.

Заключение

Благодарим за внимание! Надеемся, материал статьи помог начать работу с Styled Components в React. Благодаря своей простоте и возможности создания переиспользуемых компонентов эта библиотека  —  отличный вариант для стилизации проекта React.

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Chad Murobayashi: Introduction to Styled-Components in React