3 основных принципа для начала работы со стилями-компонентами
Этот пост изначально был опубликован на моем личном сайте.
Я люблю styled-components
. Я использую эту библиотеку для всех своих личных проектов (в том числе для своего личного сайта). Он очень мощный и также очень простой в использовании. В этой статье я расскажу о 3 основных вещах, которые вы можете делать с styled-components
, так что вы можете начать использовать его прямо сейчас.
Но сначала… Что такое стилизованные компоненты?
«Styled-components - это результат размышлений о том, как мы могли бы улучшить CSS для стилизации систем компонентов React»
styled-components
- это библиотека, которая позволяет вам писать актуальный код CSS для стилизации ваших компонентов, удаляя сопоставление между компонентами и стилями. Он использует тегированные шаблонные литералы и CSS. Вот и все.
А все остальное библиотека сделает за вас:
- Он отслеживает, какие компоненты отображаются, и внедряет их стили.
- Он использует разделение кода, поэтому ваши пользователи загружают наименьшее количество необходимого кода.
- Он генерирует уникальные имена классов для ваших стилей, поэтому вам не нужно беспокоиться о дублировании или наложении.
- Он показывает, какие стили вы не используете (поскольку они привязаны к определенному компоненту), поэтому вы можете легко удалить их. Обычно это сложно при работе с CSS.
- Он автоматически префиксов вашего CSS для работы с различными поставщиками. Вы можете просто написать свой CSS в соответствии с текущим стандартом, а остальное сделает
styled-components
.
Все звучит отлично, но вы можете подумать, что вам недостаточно писать CSS, что вам нужны динамические стили. Не волнуйтесь, styled-components
позволяет очень легко стилизовать компоненты на основе свойств или глобальных тем.
Вы готовы начать с этого? Обещаю, это будет очень просто! Давайте посмотрим, 3 важные вещи, которые вы можете делать с этой библиотекой.
Вы можете найти весь код, который мы объясним, в этой CodeSandbox.
1- Создайте и используйте свой первый стилизованный компонент
Сначала вам необходимо установить библиотеку:
npm i --save styled-components
Теперь предположим, что мы хотим создать домашнюю страницу, на которой мы отображаем заголовок в центре экрана. Что-то вроде этого:
Очень простой. Нам нужны теги div
и h1
. У div
будет такой код CSS:
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
Допустим, мы хотим, чтобы h1
был подчеркнут:
text-decoration: underline;
Давайте сделаем это с styled-components
!
Чтобы код был хорошо структурирован, давайте создадим папку components/Home
и два файла внутри нее: index.js
и styles.js
.
В нашем styles
файле мы будем создавать стилизованные компоненты.
Начнем с импорта библиотеки:
import styled from "styled-components";
Теперь, чтобы создать стилизованный компонент, нам нужно написать style.
, а затем HTML-тег, который мы хотим стилизовать. В этом случае нам сначала понадобится div
, так что давайте начнем с него. Кроме того, давайте сохраним этот компонент в переменной и экспортируем его, чтобы позже мы могли импортировать его из нашего index
файла.
export const Home = styled.div``;
Осталось только написать наши стили! А поскольку мы можем написать обычный CSS с обратными кавычками, это очень просто:
export const Home = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
`;
Поздравляю! Вы написали свой первый стилизованный компонент! 🎉
Давайте продолжим и также добавим наш компонент Title
, который будет стилизованным тегом h1
. Весь styles
файл будет выглядеть так:
import styled from "styled-components";
export const Home = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
`;
export const Title = styled.h1`
text-decoration: underline;
`;
Большой! Теперь нам нужно использовать эти компоненты. Для этого нам нужно импортировать их из наших index
файлов.
Мы могли сделать это:
import React from "react";
import { Home, Title } from "./styles";
export default function Home() {
return...
}
Но обратите внимание, что теперь у меня есть два компонента с именем Home
, так что это просто не сработает. Один из вариантов - присвоить стилизованным компонентам разные имена. Вместо того, чтобы называть его Home
, вы можете называть его Wrapper
, Container
или что-то в этом роде.
Многие люди используют этот подход, и он работает. Но лично мне это не нравится. Я хочу иметь возможность называть мой стилизованный компонент так же, как и родительский компонент. К счастью, многие люди думают так же, поэтому кто-то придумал другой подход, который мне нравится:
import React from "react";
import * as S from "./styles";
Мы можем импортировать все наши стилизованные компоненты как переменную с именем S
, а затем мы можем визуализировать их, используя эту переменную. Помните, что стилизованные компоненты похожи на обычные компоненты, поэтому вы визуализируете их, используя JSX, как обычно:
import React from "react";
import * as S from "./styles";
export default function Home() {
return (
<S.Home>
<S.Title>This is the Home page</S.Title>
</S.Home>
);
}
Мы получаем доступ к нашим стилизованным компонентам, записывая S.
, а затем имя компонента. Мне нравится этот подход, потому что теперь я могу назвать свой стилизованный компонент Home
, а также беглым взглядом я могу сказать, какие из возвращенных компонентов на самом деле являются стилизованными компонентами (в данном случае все они, кроме может не подходить для более длинных и сложных компонентов).
Стили вложения
Прежде чем перейти к шагу 2, небольшое примечание о вложении. Вы можете вкладывать стили так же, как и в SASS. В этом случае мы могли бы, например, избавиться от компонента Title
. Мы можем просто добавить стили для всех h1
, существующих в нашем Home
компоненте:
import styled from "styled-components";
export const Home = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
h1 {
text-decoration: underline;
}
`;
А если мы изменим и родительский компонент…
import React from "react";
import * as S from "./styles";
export default function Home() {
return (
<S.Home>
<h1>This is the Home page</h1>
</S.Home>
);
}
Это будет работать нормально. Не всегда имеет смысл вкладывать стили, но имейте в виду, что вы можете это сделать, и вам, возможно, не потребуется создавать новый компонент.
2- Используйте реквизит для динамического моделирования
Помните, что стилизованные компоненты - это просто компоненты, поэтому они могут получать реквизиты. И этот реквизит может быть полезен для динамического изменения стилей.
Наш пример очень прост, но предположим, что мы хотим установить цвет текста заголовка на основе свойства с именем titleColor
.
Во-первых, давайте передадим эту опору при рендеринге нашего компонента в стиле Title
:
import React from "react";
import * as S from "./styles";
export default function Home() {
return (
<S.Home>
<S.Title titleColor="blue">This is the Home page</S.Title>
</S.Home>
);
}
А теперь давайте воспользуемся этой опорой, чтобы изменить цвет текста. Нам нужно использовать ${}
, чтобы получить доступ к реквизитам. Все очень просто:
export const Title = styled.h1`
text-decoration: underline;
color: ${prop => prop.titleColor};
`;
Это сделает текст синим:
Вы также можете использовать реквизиты для условного стиля. Например, допустим, мы передаем опору small
:
import React from "react";
import * as S from "./styles";
export default function Home() {
return (
<S.Home>
<S.Title titleColor="blue" small>
This is the Home page
</S.Title>
</S.Home>
);
}
Если он есть, мы хотим сделать текст меньше. Но если это не так, мы хотим, чтобы размер текста был стандартным.
export const Title = styled.h1`
text-decoration: underline;
color: ${prop => prop.titleColor};
font-size: ${prop => prop.small && "1.25rem"};
`;
Потрясающие! Теперь вы знаете, как динамически стилизовать компоненты на основе реквизита.
3- Создание глобальных стилей
Создавать стилизованные компоненты - это здорово, но иногда нам нужны глобальные стили. Вы можете применить стили, используя теги в качестве селекторов. Например, предположим, что мы хотим изменить цвет фона нашего body
.
К счастью, styled-components
делает это очень просто. Начните с импорта createGlobalStyle
:
import { createGlobalStyle } from "styled-components";
Напишите свои глобальные стили:
const GlobalStyle = createGlobalStyle`
body {
background: lightblue;
}
`;
А затем поместите этот компонент на верхний уровень вашего приложения, в моем случае мой index.js
файл:
import React from "react";
import ReactDOM from "react-dom";
import { createGlobalStyle } from "styled-components";
import App from "./App";
const GlobalStyles = createGlobalStyle`
body {
background: lightblue;
}
`;
const rootElement = document.getElementById("root");
ReactDOM.render(
<>
<GlobalStyles />
<App />
</>,
rootElement
);
Вот и все! Это изменит цвет фона:
При желании вы также можете использовать реквизиты для динамического изменения глобальных стилей (например, если в вашем приложении есть светлая и темная тема).
Вот и все!
Надеюсь, этот пост был полезен. Теперь вы знаете основы работы с styled-components
. Конечно, это еще не все, поэтому обязательно ознакомьтесь с официальной документацией.
Спасибо за чтение ❤️
Первоначально опубликовано на моем личном сайте 10 мая 2020 г.