Темы оформления
Тема может быть не только объектом, но и функцией (которая должна вернуть объект темы). Такая функция в качестве аргумента получает родительскую тему (из родительского ThemeProvider) и может ее изменить:
https://codesandbox.io/s/styledcomponents-theming-2-react-junior-rt8ye?file=/src/App.js
#стили #styledcomponents #документация #примерыкода
Тема может быть не только объектом, но и функцией (которая должна вернуть объект темы). Такая функция в качестве аргумента получает родительскую тему (из родительского ThemeProvider) и может ее изменить:
https://codesandbox.io/s/styledcomponents-theming-2-react-junior-rt8ye?file=/src/App.js
#стили #styledcomponents #документация #примерыкода
Использование тем вне стилизованных компонентов
Когда мы объявляем тему в ThemeProvider, то все стилизованные компоненты внутри него автоматически получают эту тему в проп theme. А что делать с обычными (не styled) компонентами? Они ведь тоже могли бы использовать эту тему.
Чтобы получить тему из контекста приложения, есть два способа:
https://codesandbox.io/s/styled-components-theming-3-react-junior-32cis?file=/src/App.js
1. Хук useContext
Библиотека styled-components предоставляет переменную ThemeContext, в которой находится нужный контекст.
2. Компонент высшего порядка withTheme.
Функция withTheme получает тему из провайдера и добавляет нашему обычному компоненту проп theme.
#стили #styledcomponents #примерыкода #документация
Когда мы объявляем тему в ThemeProvider, то все стилизованные компоненты внутри него автоматически получают эту тему в проп theme. А что делать с обычными (не styled) компонентами? Они ведь тоже могли бы использовать эту тему.
Чтобы получить тему из контекста приложения, есть два способа:
https://codesandbox.io/s/styled-components-theming-3-react-junior-32cis?file=/src/App.js
1. Хук useContext
Библиотека styled-components предоставляет переменную ThemeContext, в которой находится нужный контекст.
2. Компонент высшего порядка withTheme.
Функция withTheme получает тему из провайдера и добавляет нашему обычному компоненту проп theme.
#стили #styledcomponents #примерыкода #документация
Важно: внутри ThemeProvider тему для компонента можно переопределить просто передав ему объект темы в проп theme.
#стили #styledcomponents #важно
#стили #styledcomponents #важно
Рефы в стилизованных компонентах
Рефы со стилизованными компонентами работают так же, как и с обычными: в ref попадает либо ссылка на DOM-элемент, либо экземпляр React-компонента.
#стили #styledcomponents #рефы #документация
Рефы со стилизованными компонентами работают так же, как и с обычными: в ref попадает либо ссылка на DOM-элемент, либо экземпляр React-компонента.
#стили #styledcomponents #рефы #документация
Telegram
React Junior
Рефы
Реф - это прямая ссылка на компонент или на DOM-элемент. Обычно рефы используются для прямого управления DOM-элементами. React обычно не одобряет такой подход, но в некоторых ситуациях он оправдан:
- Управление фокусом, выделение текста или воспроизведение…
Реф - это прямая ссылка на компонент или на DOM-элемент. Обычно рефы используются для прямого управления DOM-элементами. React обычно не одобряет такой подход, но в некоторых ситуациях он оправдан:
- Управление фокусом, выделение текста или воспроизведение…
Безопасность
В некоторых случаях при генерации CSS в стилизованных компонентах могут использоваться данные, введенные на вашем сайте напрямую пользователями (например, вы предлагаете самостоятельно выбрать фоновое изображение). Это может привести к разного рода CSS-инъекциям.
Документация styledComponents рекомендует использовать нативную браузерную функцию CSS.escape для очистки потенциально опасного CSS (полифилл здесь).
#стили #styledcomponents #безопасность #документация
В некоторых случаях при генерации CSS в стилизованных компонентах могут использоваться данные, введенные на вашем сайте напрямую пользователями (например, вы предлагаете самостоятельно выбрать фоновое изображение). Это может привести к разного рода CSS-инъекциям.
Документация styledComponents рекомендует использовать нативную браузерную функцию CSS.escape для очистки потенциально опасного CSS (полифилл здесь).
#стили #styledcomponents #безопасность #документация
Styled Components + обычный CSS
О чем нужно помнить, используя стилизованные компоненты в одном проекте вместе с классическим CSS:
1. Специфичность стилей. Таблица стилей, генерируемая styled-components, добавляется прямо на страницу (в head), поэтому эти стили будут приоритетнее, чем стили из подключенного файла.
2. При стилизации готовых компонентов через styled(MyComponent) нужно не забывать устанавливать полученный проп className как класс DOM-элемента, иначе стили не применятся. Кроме того, можно совмеать обычные классы и this.props.className - но нужно помнить о специфичности.
3. При возникновении конфликтов стилизованных компонентов с основными стилями страницы, можно использовать плагин babel-plugin-styled-components-css-namespace, который добавит сгенерированным стилям пространство имен (дополнительный селектор по идентификатору для повышения специфичности), но лучше подобных ситуаций, конечно, избегать.
#стили #styledcomponents #документация
О чем нужно помнить, используя стилизованные компоненты в одном проекте вместе с классическим CSS:
1. Специфичность стилей. Таблица стилей, генерируемая styled-components, добавляется прямо на страницу (в head), поэтому эти стили будут приоритетнее, чем стили из подключенного файла.
2. При стилизации готовых компонентов через styled(MyComponent) нужно не забывать устанавливать полученный проп className как класс DOM-элемента, иначе стили не применятся. Кроме того, можно совмеать обычные классы и this.props.className - но нужно помнить о специфичности.
3. При возникновении конфликтов стилизованных компонентов с основными стилями страницы, можно использовать плагин babel-plugin-styled-components-css-namespace, который добавит сгенерированным стилям пространство имен (дополнительный селектор по идентификатору для повышения специфичности), но лучше подобных ситуаций, конечно, избегать.
#стили #styledcomponents #документация
Объект стилей
В функцию styled можно передавать не только строку CSS, но и объект, в котором ключами являются имена свойств. Это может быть полезно, если такой объект уже каким-то образом сгенерирован, - его можно использовать напрямую.
#стили #styledcomponents #документация
В функцию styled можно передавать не только строку CSS, но и объект, в котором ключами являются имена свойств. Это может быть полезно, если такой объект уже каким-то образом сгенерирован, - его можно использовать напрямую.
#стили #styledcomponents #документация
Изменение тега
Мы уже разбирали, что тег, который будет использован для стилизованного компонента, можно прямо указать с помощью пропа as.
Но если вы используете функцию styled() для стилизации компонента высшего порядка (HOC), проп as не дойдет до оборачиваемого компонента. В этой ситуации можно использовать проп forwardedAs.
#стили #styledcomponents #документация
Мы уже разбирали, что тег, который будет использован для стилизованного компонента, можно прямо указать с помощью пропа as.
Но если вы используете функцию styled() для стилизации компонента высшего порядка (HOC), проп as не дойдет до оборачиваемого компонента. В этой ситуации можно использовать проп forwardedAs.
#стили #styledcomponents #документация
Telegram
React Junior
Изменение тега
При создании компонента мы сразу определяем тег, который будет его представлять: styled.div или styled.button. А что делать, если одинаковые стили нужны и для кнопки, и для ссылки? Дублировать их?
К счастью, нет. Тег, к которому будут применены…
При создании компонента мы сразу определяем тег, который будет его представлять: styled.div или styled.button. А что делать, если одинаковые стили нужны и для кнопки, и для ссылки? Дублировать их?
К счастью, нет. Тег, к которому будут применены…
Запрет проброса пропсов
Пропсы, которые установлены для стилизованного компонента, будут проброшены до его HTML-элемента и использованы в качестве атрибутов. Чтобы предотвратить это, нужно добавить символ $ к имени пропа. Такой проп можно использовать в литерале строки, но до HTML-элемента он не дойдет.
#стили #styledcomponents #документация
Пропсы, которые установлены для стилизованного компонента, будут проброшены до его HTML-элемента и использованы в качестве атрибутов. Чтобы предотвратить это, нужно добавить символ $ к имени пропа. Такой проп можно использовать в литерале строки, но до HTML-элемента он не дойдет.
#стили #styledcomponents #документация
Архитектурные паттерны React для ваших проектов
Статья, посвященная организации файловой структуры (и не только) проекта: https://blog.openreplay.com/react-architecture-patterns-for-your-projects
Рекомендации:
👉 директория с исходниками называется src
👉 названия папок должны быть понятны всем членам команды, нет жестких правил, можно использовать слова-синонимы, если так проще
👉 для компонентов следует выделять отдельные папки внутри директории components
👉 кроме того, есть общий index.js файл в components, который импортирует все компоненты сразу
👉 для каждого компонента создаем отдельные файлы: для собственно кода, для стилей, для тестов и для Storybook
👉 для наименования файлов и папок хуков используйте префикс use
👉 размещайте каждый хук в отдельной папке в директории hooks вместе с файлом для тестирования
👉 по аналогии с компонентами стоит создать отдельный файл hooks/index.js, который будет импортировать все хуки проекта сразу
👉 следует использовать абсолютные импорты, для этого нужно правильно настроить сборку, указав алиас или корневую директорию
👉 отделяйте логику приложения от отображения, выносите ее в хуки по возможности
👉 константы и утилитарные методы стоит вынести в отдельную директорию utils
👉 не создавайте единый Контекст для всего, лучше создать несколько независимых контекстов с разными данными
#ссылки #паттерны #проект
Статья, посвященная организации файловой структуры (и не только) проекта: https://blog.openreplay.com/react-architecture-patterns-for-your-projects
Рекомендации:
👉 директория с исходниками называется src
👉 названия папок должны быть понятны всем членам команды, нет жестких правил, можно использовать слова-синонимы, если так проще
👉 для компонентов следует выделять отдельные папки внутри директории components
👉 кроме того, есть общий index.js файл в components, который импортирует все компоненты сразу
👉 для каждого компонента создаем отдельные файлы: для собственно кода, для стилей, для тестов и для Storybook
👉 для наименования файлов и папок хуков используйте префикс use
👉 размещайте каждый хук в отдельной папке в директории hooks вместе с файлом для тестирования
👉 по аналогии с компонентами стоит создать отдельный файл hooks/index.js, который будет импортировать все хуки проекта сразу
👉 следует использовать абсолютные импорты, для этого нужно правильно настроить сборку, указав алиас или корневую директорию
👉 отделяйте логику приложения от отображения, выносите ее в хуки по возможности
👉 константы и утилитарные методы стоит вынести в отдельную директорию utils
👉 не создавайте единый Контекст для всего, лучше создать несколько независимых контекстов с разными данными
#ссылки #паттерны #проект
Openreplay
React Architecture Patterns for Your Projects
Use these React patterns to structure your project and scale them as much as you need
👍1
Babel плагин для стилизованных компонентов
Плагин babel-plugin-styled-components добавляет поддержку серверного рендинга, минификацию стилей и более удобную отладку.
Страница в документации с подробным описанием: https://styled-components.com/docs/tooling#babel-plugin
#стили #styledcomponents #документация #инструменты
Плагин babel-plugin-styled-components добавляет поддержку серверного рендинга, минификацию стилей и более удобную отладку.
Страница в документации с подробным описанием: https://styled-components.com/docs/tooling#babel-plugin
#стили #styledcomponents #документация #инструменты
styled-components
styled-components: Tooling
Additional Tools for styled-components, babel and TypeScript plugins, testing
👍1
Запрет проброса пропсов
Мы уже знаем, что можно запретить проброс пропсов стилизованного компонента до самого HTML-узла и превращение их в атрибуты: https://yangx.top/react_junior/176
Для этого нужно просто добавить к имени пропа символ
Но есть и более сложный механизм фильтрации таких пропсов: метод shouldForwardProp. Он может пригодиться, если множество компонентов высшего порядка составлены в один и используют один и тот же проп.
У созданного с помощью функции
🤔 В документации не нашлось других примеров использования метода
‼️ Важно: остальные методы компонента, например, attrs должны идти в цепочке после
Итак, функция
#стили #styledcomponents #документация #примерыкода
Мы уже знаем, что можно запретить проброс пропсов стилизованного компонента до самого HTML-узла и превращение их в атрибуты: https://yangx.top/react_junior/176
Для этого нужно просто добавить к имени пропа символ
$
. Но есть и более сложный механизм фильтрации таких пропсов: метод shouldForwardProp. Он может пригодиться, если множество компонентов высшего порядка составлены в один и используют один и тот же проп.
У созданного с помощью функции
styled()
компонента нужно вызвать метод withConfig
и передать ему объект конфигурации с полем shouldForwardProp
.🤔 В документации не нашлось других примеров использования метода
withConfig
.‼️ Важно: остальные методы компонента, например, attrs должны идти в цепочке после
withConfig
.Итак, функция
shouldForwardProp
- это просто фильтр для пропов. Она получает два аргумента: имя свойства и (опционально) дефолтную функцию валидации, которая отфильтровывает только имена HTML-атрибутов. Внутри shouldForwardProp
вы можете разместить любую логику отбора по имени пропа.#стили #styledcomponents #документация #примерыкода
👍1
Стилизованные компоненты без компонентов
Если вы не хотите создавать отдельный стилизованный компонент, но хотите при этом стилизовать какой-то элемент в той же манере, можно использовать проп
Любой элемент, для которого указан проп
Импортировать ничего не нужно, этот проп обрабатывается плагином автоматически.
#стили #styledcomponents #документация
Если вы не хотите создавать отдельный стилизованный компонент, но хотите при этом стилизовать какой-то элемент в той же манере, можно использовать проп
css
. Его можно установить и для обычного HTML-элемента, и для React-компонента, но чтобы он правильно обрабатывался, нужно использовать плагин для Babel.Любой элемент, для которого указан проп
css
под капотом будет превращаться в стилизованный компонент.Импортировать ничего не нужно, этот проп обрабатывается плагином автоматически.
#стили #styledcomponents #документация
Telegram
React Junior
Babel плагин для стилизованных компонентов
Плагин babel-plugin-styled-components добавляет поддержку серверного рендинга, минификацию стилей и более удобную отладку.
Страница в документации с подробным описанием: https://styled-components.com/docs/tooling#babel…
Плагин babel-plugin-styled-components добавляет поддержку серверного рендинга, минификацию стилей и более удобную отладку.
Страница в документации с подробным описанием: https://styled-components.com/docs/tooling#babel…
Макрос для Babel
Библиотека styled components также может использоваться в виде babel macro. Макрос - это альтернатива для плагина babel, которая не нуждается во внешней конфигурации и отдельном подключении. Подробнее о макросах Babel в документации.
Если ваш проект создан с помощью create-react-app, то он уже поддерживает использование макросов из коробки. В ином случае сначала нужно подключить babel-plugin-macros.
Макрос нужно импортировать из 'styled-components/macro', а затем можно использовать вместо плагина.
#стили #styledcomponents #документация
Библиотека styled components также может использоваться в виде babel macro. Макрос - это альтернатива для плагина babel, которая не нуждается во внешней конфигурации и отдельном подключении. Подробнее о макросах Babel в документации.
Если ваш проект создан с помощью create-react-app, то он уже поддерживает использование макросов из коробки. В ином случае сначала нужно подключить babel-plugin-macros.
Макрос нужно импортировать из 'styled-components/macro', а затем можно использовать вместо плагина.
#стили #styledcomponents #документация
Использование вместе с TypeScript
При установке пропа css для произвольных элементов TypeScript будет выдавать ошибки. Чтобы избежать этого, нужно установить пакет
#стили #styledcomponents #документация #typescript
При установке пропа css для произвольных элементов TypeScript будет выдавать ошибки. Чтобы избежать этого, нужно установить пакет
@types/styled-components
, а также прописать этот импорт в проекте:import {} from 'styled-components/cssprop'
#стили #styledcomponents #документация #typescript
Telegram
React Junior
Стилизованные компоненты без компонентов
Если вы не хотите создавать отдельный стилизованный компонент, но хотите при этом стилизовать какой-то элемент в той же манере, можно использовать проп css. Его можно установить и для обычного HTML-элемента, и для…
Если вы не хотите создавать отдельный стилизованный компонент, но хотите при этом стилизовать какой-то элемент в той же манере, можно использовать проп css. Его можно установить и для обычного HTML-элемента, и для…
StyleSheetManager
StyleSheetManager - вспомогательный компонент для настройки процесса обработки стилей. Выглядит как обычный React-компонент, принимает пропы для разных настроек. Например, можно отменить добавление вендорных префиксов к стилям (по умолчанию они добавляются).
#стили #styledcomponents #документация
StyleSheetManager - вспомогательный компонент для настройки процесса обработки стилей. Выглядит как обычный React-компонент, принимает пропы для разных настроек. Например, можно отменить добавление вендорных префиксов к стилям (по умолчанию они добавляются).
#стили #styledcomponents #документация
isStyledComponent
Утилитарная функция для определения, является ли компонент стилизованным компонентом.
#стили #styledcomponents #документация
Утилитарная функция для определения, является ли компонент стилизованным компонентом.
#стили #styledcomponents #документация
Получение текущей темы оформления
Мы уже говорили про поддержку и использование тем оформления в styled components. Вкратце повторю: используем компонент
В документации нашелся еще хук
#стили #styledcomponents #документация
Мы уже говорили про поддержку и использование тем оформления в styled components. Вкратце повторю: используем компонент
ThemeProvider
, передаем ему нужную тему, а затем во всех нижележащих компонентах можем извлечь эту актуальную тему из пропа theme
.В документации нашелся еще хук
useTheme
, который тоже позволяет получать текущую тему из провайдера. Можно использовать как альтернативу пропу theme
, если потребуется.#стили #styledcomponents #документация
ThemeConsumer
Еще одна альтернатива использованию пропа
#стили #styledcomponents #документация
Еще одна альтернатива использованию пропа
theme
с текущей темой оформления - это компонент ThemeConsumer
. Он использует паттерн render prop, то есть рендерит функцию, которая получает в качестве параметра тему и должна вернуть нужную разметку.#стили #styledcomponents #документация
Утилиты styled components для тестирования
Вспомогательные функции для тестирования находятся в модуле
👉
👉
👉
#стили #styledcomponents #документация #тестирование
Вспомогательные функции для тестирования находятся в модуле
styled-components/test-utils
.👉
find
- находит первый подходящий стилизованный компонент в DOM-дереве (похоже на element.querySelector
)find(document.body, Foo)
👉
find
- находит все подходящие стилизованные компоненты в DOM-дереве (похоже на element.querySelectorAll
)👉
enzymeFind
- находит стилизованные компоненты внутри обертки, созданной методом mount
библиотеки enzyme
.#стили #styledcomponents #документация #тестирование
Интеграция styled-components с Jest
Подробнее в документации: https://styled-components.com/docs/tooling#jest-integration
Для тестирования стилизованных компонентов с помощью Jest есть специальный пакет jest-styled-components. Он улучшает тестирование снапшотами и предоставляет дополнительную проверку для стилей -
Для тестирования используем тестовый рендерер React.
#стили #styledcomponents #документация #тестирование #jest
Подробнее в документации: https://styled-components.com/docs/tooling#jest-integration
Для тестирования стилизованных компонентов с помощью Jest есть специальный пакет jest-styled-components. Он улучшает тестирование снапшотами и предоставляет дополнительную проверку для стилей -
toHaveStyleRule
.Для тестирования используем тестовый рендерер React.
#стили #styledcomponents #документация #тестирование #jest
styled-components
styled-components: Tooling
Additional Tools for styled-components, babel and TypeScript plugins, testing