Знакомство с библиотекой Styled Components в React
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” указывается имя компонента.
Например, создадим компонент в новом файле /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 псевдокласс :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;
>
`;
Теперь наведение курсора на кнопку приведет к соответствующим изменениям цветов фона и текста надписи.
Передача свойств стилизованному компоненту
В стилизованные компоненты также передаются свойства. Вы можете передать любое из них в компонент Button и там получить к нему доступ.
Например, передадим Button свойство bgcolor=»springGreen» и в файле Button.styled.ts получим к нему доступ.
background-color: $ props.bgcolor>;
Если у вас JavaScript, то все сработает отлично. Но в случае с TypeScript возникнет ошибка.
Исправить эту ошибку поможет создание интерфейса для компонента Button . В нем вы можете определить свойства, передаваемые в Button .
interface ButtonProps bgcolor: string;
>
Затем передаем данный интерфейс в компонент Button и получаем доступ к свойству bgcolor . При этом TypeScript не сигнализирует об ошибке.
export const Button = styled.button `
background-color: $ props.bgcolor>;
. other styles
`;
С помощью деструктуризации немного почистим код.
export const Button = styled.button `
background-color: $<(< bgcolor >) => bgcolor>;
. other styles
`;
Создание и применение темы
Styled Components также позволяет создать глобальную тему (theme) для хранения различных значений, к которым нужно получить доступ в любом стилизованном компоненте.
Например, в компоненте Button вместо передачи свойства каждой используемой кнопке мы получаем доступ к значению из темы.
Для работы с ней необходимо обернуть приложение с помощью .
В файле App.tsx выполняем import < ThemeProvider >from ‘styled-components’ . Затем оборачиваем все приложение с помощью ThemeProvider , который принимает одно свойство theme .
function App() return (
>
);
>
Свойство 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.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.
- Python Django: Front End на React
- Как создать библиотеку компонентов React
- Как добавить простую функцию поиска в приложение на React без сервера
Styled Components¶
Обратите внимание на атрибут «as» компонента «Button». Он позволяет изменять HTML-тег, сохраняя стилизацию.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
import styled, createGlobalStyle, keyframes, > from 'styled-components'; const GlobalStyle = createGlobalStyle` *, *::before, *::after margin: 0; padding: 0; box-sizing: border-box; > body min-height: 100vh; background: radial-gradient(yellow, orange); display: grid; place-content: center; text-align: center; > `; const Button = styled.button` margin: 0.5em; padding: 0.5em 0; width: 132px; background: $(props) => props.primary ? '#337ab7' : '#f0f0f0f'>; outline: none; border: none; border-radius: 4px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); font-family: Audiowide; font-size: 1em; letter-spacing: 2px; text-transform: uppercase; color: $(props) => props.primary ? '#f0f0f0' : '#1c1c1c'>; cursor: pointer; user-select: none; transition: 0.2s; &:hover transform: scale(1.05); > &:active box-shadow: none; > `; const SuccessButton = styled(Button)` background: #5cb85c; color: #f0f0f0; `; const ReversedButton = (props) => ( Button props> children=props.children.split('').reverse()> /> ); const Input = styled.input.attrs((props) => ( type: 'text', placeholder: 'Some text. ', size: props.size || '1em', >))` border: none; border-radius: 4px; box-shadow: 0 0 2px inset rgba(0, 0, 0, 0.5); font-family: Audiowide; font-size: $(props) => props.size>; text-align: center; color: rgba(0, 0, 0, 0.5); margin: 0.5rem; padding: 0.5rem 0; `; const PasswordInput = styled(Input).attrs( type: 'password', placeholder: 'Secret key. ', >)``; const fade = keyframes` from opacity: 1; > to opacity: 0; > `; const FadeButton = styled(Button)` animation: $fade> 2s linear infinite alternate; `; export default function App() return ( <> GlobalStyle /> Button>base/Button> br /> Button primary>primary/Button> br /> SuccessButton>success/SuccessButton> br /> Button primary as="a" href="#" style= <textDecoration: 'none', display: 'inline-block', textAlign: 'center', >> > link /Button> br /> Button as=ReversedButton>>reversed/Button> br /> Input /> br /> Input size="1.25em" /> br /> PasswordInput /> br /> FadeButton primary>fade/FadeButton> /> ); >
Комментарии
(C) 2021-2023, Справочник React разработчика с примерами кода
Разбираемся с styled-components и prop-types

Чтобы начать использовать Scss в React необходимо подключить scss файл в нужный компонент:
import "./Header.scss";
const Header = () => < return ( Cv builder Print Github ); >;
А Header/Header.scss тогда будет выглядеть как-то так:
.Header < padding: 1rem 0; margin-bottom: 1rem; background-color: white; >.Header_wrapper < display: flex; align-items: center; justify-content: space-between; >.Header_logo

Установка styled-components
Styled-components — это библиотека под React / React Native для написания и управления CSS. Это решение «CSS-in-JS»., то есть вы пишете CSS в файлах js / jsx. Более того, Styled-components больше похож на SCSS, что дает преимущества в использовании переменных и тп.
Чтобы установить styled-components необходимо прописать команду:
// with npm npm install styled-components // with yarn yarn add styled-components
Использование styled-components в реакте
Чтобы начать использовать styled-components нужно прописать импорт в файле jsx:
import styled from "styled-components";
Пример Avatar.jsx при помощи styled-components:
const Wrapper = styled.div` width: 10rem; height: 10rem; background-color: #bfbfbf; align-items: center; margin-right: 4rem; `; const Avatar = () => < return ; >;
Или еще красивее:
import styled from "styled-components"; const Avatar = styled.div` width: 10rem; height: 10rem; background-color: #bfbfbf; align-items: center; margin-right: 4rem; `; export default Avatar;
Установка prop-types в React
Prop-types — нужен для проверки типов во время рендера для React props.
Команда для установки prop-types:
npm install --save prop-types
Использование prop-types в связке с styled-components:
Для использования prop-types нужно прописать импорты:
// ES6 (for react) import propTypes from 'prop-types'; // Or ES5 (for node) var PropTypes = require('prop-types');
Передача props в styled-components выглядит так (на примере того-же аватара):
import styled from "styled-components"; const Avatar = styled.div` width: 10rem; height: 10rem; border-radius: $ (props.isSquare ? "10px" : "50%")>; background-color: #bfbfbf; align-items: center; margin-right: 4rem; `; export default Avatar;
Пример валидация пропов при помощи props-types и передача этих props в styled-component выглядит следующим образом:
Объявление props в компоненте, где Wrapper это тот же аватар:
const Avatar = () => < return onClick= />; >;
Avatar.propTypes = < isSquare: propTypes.bool, onClick: propTypes.func, >; Avatar.defaultProps = < isSquare: false, onClick: () =><>, >;
Осталось только отловить onClick на родителе App.js :
И написать функцию на handleAvatarClick :
const handleAvatarClick = () => console.log("avatar clicked");
Что выбрать styled-components или scss?
Выбирать styled-components или scss это ваше дело. По своему опыту могу сказать, что styled-components откровенно «тупит» в компоненах, где происходит частый ререндер.
Например, я делал color-picker на реакте и там был компонент палетты (это когда надо дергать ползунок и выбирать цвет) и каждый раз, когда менялся цвет, то styled-components начинал рерндерить компонент, в который этот цвет передавался, что приводило к диким лагам (даже с withDebounceInput на инпуте), а подключив scss лаги моментально прошли (по-хорошему, там надо было переписать код, тогда бы и на styled-components лагов не было).
Поэтому я предпочитаю комбинировать styled-components с scss либо чистый css-in-js. Потому что плюсы, которые дает styled-components:
- читаемость кода;
- удобство использования;
- подход css-in-js, который подразумевает, что стили являются динамическими и файла .css просто не будет
перевешивают минусы, как мне кажется.
UPD: когда загрузил видео, вспомнил, что забыл сказать про конфигурации для styled-compoennts и что можно сделать так, чтобы классы генерировались с названием компонента, например: класс kav01 будет выглядеть как Avatar-kav01 . Такое также можно настроить только на dev разработке, а на prod оставлять все без префиксов. Подробнее об этом можете почитать тут.
Исходники:
- Полный плейлист этого курса доступен на ютубе
- Код из текущего видео можно скачать кликнув тут
- Исходный код и весь проект вы можете скачать на гитахбе буду рад вашей звездочке ✨
Styled Components — стилизация React-приложений

Сегодня мы рассмотрим удобную библиотеку для React – Styled Components. Она предназначена для реализации стилей в JavaScript файлах на основании входных данных React-компонентов — пропсов (props).
Детям из Мариуполя нужно 120 ноутбуков для обучения — подари старое «железо», пусть оно работает на будущее Украины

Особенности Styled Components
React — это отличный способ писать большие и быстрые JavaScript-приложения. При разработке динамических приложений c этим инструментом часто приходится стилизовать контент. По ряду причин использование стандартных средств CSS для этого не совсем удобно. Библиотека Styled Components дает возможность выполнить стилизацию React-приложения, упростив и ускорив написание кода. Styled Components позволяет работать со стилями прямо в JavaScript — это компонент, который в стиль подсовывает функцию от каких-то аргументов. В Styled Components вы обращаетесь к функции и она, по сути, может делать что угодно, возвращая любое строковое значение для стиля этого компонента.
Преимущества и недостатки Styled Components в React-приложениях

Ранее, до появления Styled Components, если нужно было сделать динамические стили, их нужно было выносить в inline или писать много className. Но с этой библиотекой вы больше не стилизуете элементы HTML или компоненты на основании их класса или HTML-элемента. Отпадает необходимость в тернарных операторах, нет надобности прибегать к className . Вместо этого используются пропсы внутри компонент, с указанием стилей, а классы генерируются автоматически (к слову, проблема коллизии имен отсутствует как таковая). Обращение к стилям CSS происходит прямо в JavaScript, благодаря чему им легко управлять, он понятен, нет необходимости учить какой-то дополнительный синтаксис.
Стили легко отслеживать. Предположим, вы написали какой-то компонент, а затем его убрали, а стили остались – от них нужно избавиться, чтобы они лишний раз не грузились на клиент. Такая проблема со Styled Components решается автоматически — удалили компонент, удалились стили. Также к преимуществам Styled Components можно отнести наличие серверного рендеринга и модульных тестов.
Курс Стратегический маркетинг.
Від хаосу до системного маркетингу разом із Тетяною Лукинюк, B2C-директором у Kyivstar, колишнім CMO у Coca-Cola, Mars Ukraine та генеральною директоркою у Red Bull Ukraine.
Очевидный недостаток Styled Components – привязка к React. Кроме того, зарезервированные названия (height, width, background-color и пр.) мы не должны использовать как входные данные React-компонентов. Еще один минус данной библиотеки – стили не сохраняются в кеше, стиль появляется только тогда, когда исполняется JavaScript. Это несколько влияет на производительность.
Установка Styled Components
Для начала разберемся с установкой Styled Components. Ее можно выполнить одной командой в командной строке:
# менеджер пакетов npm
npm install —save styled-components