React JSS. Отдельные контексты тем
Можно создавать собственные контексты тем, с собственными провайдерами и хуками
Контекст создается с помощью функции
Подробнее в документации: https://cssinjs.org/react-jss?v=v10.9.0#using-custom-theming-context
#документация #стили #jss
Можно создавать собственные контексты тем, с собственными провайдерами и хуками
useTheme
, например, чтобы избежать конфликтов разных тем.Контекст создается с помощью функции
createTheming
. А потом из него уже берутся ThemeProvider
и хук useTheme
.Подробнее в документации: https://cssinjs.org/react-jss?v=v10.9.0#using-custom-theming-context
#документация #стили #jss
Настройка JSS с помощью JssProvider
react-jss предоставляет компонент
С помощью
Подробнее в документации: https://cssinjs.org/react-jss?v=v10.9.0#class-name-generator-options
#документация #стили #jss
react-jss предоставляет компонент
JssProvider
, который позволяет более тонко настроить механизм работы JSS. Соответственно все настройки будут действовать для дочерних компонентов провайдера.С помощью
JssProvider
, например, можно изменить функцию, которая генерирует имена классов.Подробнее в документации: https://cssinjs.org/react-jss?v=v10.9.0#class-name-generator-options
#документация #стили #jss
cssinjs.org
JSS
A lib for generating CSS from JavaScript
Получив представление о React JSS идем дальше по списку способов стилизации React-компонентов.
Следующий в списке Radium, но честно говоря, он выглядит каким-то не очень живым.
Репозиторий: https://github.com/FormidableLabs/radium
Radium - это опенсорсная библиотека от Formidable. В репозитории указано, что она стабильна, изменения больше не вносятся. На npm довольно много скачиваний.
Разберем его коротко, для общего развития.
Компонент высшего порядка
Radium - это HOC, то есть функция, которая оборачивает ваш компонент как декоратор, добавляя к нему некоторую функциональность. В данном случае - это функциональность обработки стилей.
Стили предполагается оформлять в виде объекта, практически как в JSS, с некоторыми тонкостями.
Основная же идея здесь в том, что мы имеем дело с inline-стилями. То есть Radium не генерирует CSS, а навешивает стили прямо на элемент.
Он даже умеет эмулировать псевдоклассы
Медиа-запросы тоже поддерживаются, но с условиями. Для них как раз генерируется CSS, и нужно использовать компонент
В целом на первый взгляд выглядит довольно проблемно: инлайновые стили, эмуляция состояний из JavaScript, не поддерживаются другие псевдоклассы, нет псевдоэлементов.
Небольшая практика: https://codesandbox.io/s/radium-react-junior-3utg2?file=/src/Button.js
#документация #стили #radium #примерыкода
Следующий в списке Radium, но честно говоря, он выглядит каким-то не очень живым.
Репозиторий: https://github.com/FormidableLabs/radium
Radium - это опенсорсная библиотека от Formidable. В репозитории указано, что она стабильна, изменения больше не вносятся. На npm довольно много скачиваний.
Разберем его коротко, для общего развития.
Компонент высшего порядка
Radium - это HOC, то есть функция, которая оборачивает ваш компонент как декоратор, добавляя к нему некоторую функциональность. В данном случае - это функциональность обработки стилей.
Стили предполагается оформлять в виде объекта, практически как в JSS, с некоторыми тонкостями.
Основная же идея здесь в том, что мы имеем дело с inline-стилями. То есть Radium не генерирует CSS, а навешивает стили прямо на элемент.
Он даже умеет эмулировать псевдоклассы
:focus
, :hover
и :active
- с помощью отслеживания событий из JavaScript. Из-за такого механизма не получится, например, эмулировать ховер из панели разработчика.Медиа-запросы тоже поддерживаются, но с условиями. Для них как раз генерируется CSS, и нужно использовать компонент
StyleRoot
, чтобы вставлять его.В целом на первый взгляд выглядит довольно проблемно: инлайновые стили, эмуляция состояний из JavaScript, не поддерживаются другие псевдоклассы, нет псевдоэлементов.
Небольшая практика: https://codesandbox.io/s/radium-react-junior-3utg2?file=/src/Button.js
#документация #стили #radium #примерыкода
Telegram
React Junior
10 способов стилизации React-приложений
React не работает со стилями и не имеет предпочтений в том, как стилизовать приложение. Это значит, что мы можем действовать по своему усмотрению: можем писать инлайновый стили или по традиции подключать внешние файлы.…
React не работает со стилями и не имеет предпочтений в том, как стилизовать приложение. Это значит, что мы можем действовать по своему усмотрению: можем писать инлайновый стили или по традиции подключать внешние файлы.…
Визуальное руководство по хуку useEffect
Статьи (англ.):
👉 Первая часть (основная информация)
👉 Вторая часть (сброс эффекта)
Неплохая статья с анимированными примерами кода. Поможет освежить в памяти (или немного глубже понять), как работает хук useEffect в React.
Вкратце:
✔️ Любые действия с сайд-эффектами внутри компонента должны выполняться внутри хука
✔️ Функция переданная в
✔️ Если эффект продолжает работать даже после размонтирования компонента (например,
#хуки #ссылки
Статьи (англ.):
👉 Первая часть (основная информация)
👉 Вторая часть (сброс эффекта)
Неплохая статья с анимированными примерами кода. Поможет освежить в памяти (или немного глубже понять), как работает хук useEffect в React.
Вкратце:
✔️ Любые действия с сайд-эффектами внутри компонента должны выполняться внутри хука
useEffect
, иначе мы можем получить бесконечный цикл (эффект запускается при рендеринге, меняет состояние компонента, вызывает новый рендеринг и по кругу).✔️ Функция переданная в
useEffect
запускается после рендеринга. Можно также установить зависимости. Если какая-то зависимость изменилась, эффект запускается.✔️ Если эффект продолжает работать даже после размонтирования компонента (например,
setInterval
), его нужно очищать. Для этого из эффекта нужно вернуть функцию, которая очистит последствия этого эффекта.#хуки #ссылки
React Shadow
Еще один способ стилизовать приложение React - использовать теневой DOM. Shadow DOM - это изолированное DOM-дерево внутри главного DOM-дерева документа. В нем не действуют стили документа, то есть не возникает никаких конфликтов.
Теневой DOM внутри какого-либо элемента (хоста), можно создать и с помощью обычного JavaScript, но так как мы работаем с React, будет логично взять готовый модуль react-shadow.
https://codesandbox.io/s/react-shadow-react-junior-4pko0?file=/src/App.js
Импортируем из модуля объект
__Примечание: Вместо root.div можно использовать root.article, root.p, root.h1, и другие элементы, к которым по спецификации можно прикрепить теневой dom.__
Чтобы стилизовать то, что находится "в тени", нужно передать туда стили - как обычный тег
Стили, расположенные внутри shadow dom действуют только на этот shadow dom. При этом внешние стили документа сюда не проникают.
#стили #shadowdom #примерыкода
Еще один способ стилизовать приложение React - использовать теневой DOM. Shadow DOM - это изолированное DOM-дерево внутри главного DOM-дерева документа. В нем не действуют стили документа, то есть не возникает никаких конфликтов.
Теневой DOM внутри какого-либо элемента (хоста), можно создать и с помощью обычного JavaScript, но так как мы работаем с React, будет логично взять готовый модуль react-shadow.
https://codesandbox.io/s/react-shadow-react-junior-4pko0?file=/src/App.js
Импортируем из модуля объект
root
. Чтобы создать Shadow Host, используем компонент root.div
. Это автоматически создаст обычный div-элемент с теневым dom. Все, что вы поместите внутрь root.div
будет находиться уже в теневом dom.__Примечание: Вместо root.div можно использовать root.article, root.p, root.h1, и другие элементы, к которым по спецификации можно прикрепить теневой dom.__
Чтобы стилизовать то, что находится "в тени", нужно передать туда стили - как обычный тег
style
. Важно, что это должна быть именно строка стилей (не объект), поэтому если вы импортируете стили из другого файла, убедитесь это именно строка.Стили, расположенные внутри shadow dom действуют только на этот shadow dom. При этом внешние стили документа сюда не проникают.
#стили #shadowdom #примерыкода
React Shadow
Немного более пристальный взгляд на react-shadow: https://codesandbox.io/s/react-shadow-2-react-junior-fd58m?file=/src/App.js
Все фичи React работают, состояние внутри теневого dom меняется, на хост можно установить `ref`и через него добраться до shadow root.
#стили #shadowdom #примерыкода
Немного более пристальный взгляд на react-shadow: https://codesandbox.io/s/react-shadow-2-react-junior-fd58m?file=/src/App.js
Все фичи React работают, состояние внутри теневого dom меняется, на хост можно установить `ref`и через него добраться до shadow root.
#стили #shadowdom #примерыкода
CodeSandbox
React Shadow 2. React Junior - CodeSandbox
React Shadow 2. React Junior by furrycat.web using prop-types, react, react-dom, react-scripts, react-shadow
3 паттерна для создания React-компонентов
Статья (англ.): https://blog.openreplay.com/3-react-component-design-patterns-you-should-know-about
Несмотря на то, что React не навязывает разработчикам определенную структуру проекта или методику создания компонентов, есть некоторые популярные паттерны, которые используются во многих проектах. Вероятно, они действительно хороши, и их стоит, как минимум, рассмотреть. Статья описывает три таких паттерна.
Презентационные компоненты и компоненты-контейнеры
Презентационные компоненты отвечают только за внешний вид. Они получают данные через пропсы, выводят их и никак не зависят от других компонентов. Очень часто презентационные компоненты не имеют состояния, но также могут отслеживать какое-то состояние, связанное с интерфейсом (например, текст в поле ввода). Примеры презентационных компонентов: список элементов, поле ввода.
Компоненты-контейнеры обеспечивают логику приложения. У них есть состояние, они используют различные методы жизненного цикла и содержат в себе презентационные компоненты для вывода данных. Именно в контейнерных компонентах происходит запрос и обработка данных.
Этот паттерн позволяет отделить логику от представления и повысить реюзабельность компонентов, например, в одном и том же контейнере можно использовать разные презентационные компоненты.
Провайдер
Паттерн Провайдер решает проблему многоуровневого проброса пропсов по цепочке компонентов. Вместо того, чтобы передавать данные вниз, через незаинтересованные компоненты, мы можем создать единое хранилище данных и связываться с ним только там, где это действительно необходимо.
Пример Провайдера в React - это контекст. Мы создаем объект контекста с нужными данными (например, цветовой темой приложения), оборачиваем все приложение в провайдер этого контекста и в нужных местах связываемся с ним с помощью хука useContext, или свойства contextType, или Context.Consumer.
Этот паттерн здорово облегчает передачу данных, но при этом затрудняет переиспользование компонентов, так как они зависят от данных провайдера.
Составные компоненты
Компоненты в React могут работать в симбиозе, разделяя общее состояние. Например, компонент списка (
Но у
Реализовав этот паттерн мы сможем удобно оформлять список, выделяя каждый элемент в
#паттерны #ссылки
Статья (англ.): https://blog.openreplay.com/3-react-component-design-patterns-you-should-know-about
Несмотря на то, что React не навязывает разработчикам определенную структуру проекта или методику создания компонентов, есть некоторые популярные паттерны, которые используются во многих проектах. Вероятно, они действительно хороши, и их стоит, как минимум, рассмотреть. Статья описывает три таких паттерна.
Презентационные компоненты и компоненты-контейнеры
Презентационные компоненты отвечают только за внешний вид. Они получают данные через пропсы, выводят их и никак не зависят от других компонентов. Очень часто презентационные компоненты не имеют состояния, но также могут отслеживать какое-то состояние, связанное с интерфейсом (например, текст в поле ввода). Примеры презентационных компонентов: список элементов, поле ввода.
Компоненты-контейнеры обеспечивают логику приложения. У них есть состояние, они используют различные методы жизненного цикла и содержат в себе презентационные компоненты для вывода данных. Именно в контейнерных компонентах происходит запрос и обработка данных.
Этот паттерн позволяет отделить логику от представления и повысить реюзабельность компонентов, например, в одном и том же контейнере можно использовать разные презентационные компоненты.
Провайдер
Паттерн Провайдер решает проблему многоуровневого проброса пропсов по цепочке компонентов. Вместо того, чтобы передавать данные вниз, через незаинтересованные компоненты, мы можем создать единое хранилище данных и связываться с ним только там, где это действительно необходимо.
Пример Провайдера в React - это контекст. Мы создаем объект контекста с нужными данными (например, цветовой темой приложения), оборачиваем все приложение в провайдер этого контекста и в нужных местах связываемся с ним с помощью хука useContext, или свойства contextType, или Context.Consumer.
Этот паттерн здорово облегчает передачу данных, но при этом затрудняет переиспользование компонентов, так как они зависят от данных провайдера.
Составные компоненты
Компоненты в React могут работать в симбиозе, разделяя общее состояние. Например, компонент списка (
Menu
) и компоненты отдельных элементов списка (MenuItem
). Вынесение элементов в отдельные компоненты может быть удобно с точки зрения передачи пропсов и структуризации кода. Но у
Menu
и MenuItem
есть общее состояние - активный элемент, оно должно храниться в компоненте Menu
, значит, его нужно передать во все вложенные компоненты MenuItem
. Об этом должен позаботиться сам компонент списка (например, с помощью React Context), тогда мы получим составной компонент (compound component). Реализовав этот паттерн мы сможем удобно оформлять список, выделяя каждый элемент в
MenuItem
, но при этом не придется заботиться о передаче состояния элементам, так как это происходит под капотом.#паттерны #ссылки
Openreplay
3 React Component Design Patterns You Should Know About
Top 3 design patterns used to create React.JS components that you should know about
👍2
Используете эти паттерны в разработке?
Anonymous Poll
42%
Презентационные компоненты и контейнеры
33%
Провайдер
58%
Составные компоненты
42%
Ничего не использую
JSX Style
И наконец, последний в списке способ стилизации React-компонентов - JSX Style (есть еще утилитарные фреймворки, но это не специфический для React подход).
Репозиторий jsxstyle: https://github.com/jsxstyle/jsxstyle
jsxstyle предлагает указывать стили в inline-режиме, то есть не выносить их в отдельный объект, а писать прямо в пропсах компонентов. Библиотека предоставляет несколько готовых компонентов с уже предустановленными стилями отображения (
Пример: https://codesandbox.io/s/jsxstyle-react-junior-wn88n?file=/src/App.js
jsxstyle утверждает, что самое сложное в CSS - придумывать названия для классов, поэтому они полностью избавились от них, предоставив готовые блоки и максимально утилитарный стиль использования.
В целом, это немного другой способ "думать о стилях", чем те, которые мы разбирали ранее. Документация утверждает, что он проще и удобнее для работы и для оптимизации. 🤔
По умолчанию компоненты jsxstyle рендерятся в обычные дивы, но можно указать любой тег в пропе
Атрибуты, которые не относятся к стилям и должны быть установлены прямо на HTML-элемент (вроде
Поддерживаются псевдоэлементы и псевдоклассы. Чтобы задать, например, цвет плейсхолдера, нужно использовать свойство
Медиа-запросы тоже есть. Чтобы их использовать нужно указать список запросов в пропе
В качестве альтернативы такому громоздкому синтаксису можно использовать хук
В целом, мне не очень нравится образ мышления "jsxstyle", возможно, мой мозг для него еще просто не готов 🤯. Код получается, возможно, и более понятным (или нет), но уж точно намного более раздутым. Но что еще хуже, нет развернутой документации, только readme в репозитории. Так что дальше углубляться в jsxstyle, пожалуй, не буду.
#стили #jsxstyle #примерыкода
И наконец, последний в списке способ стилизации React-компонентов - JSX Style (есть еще утилитарные фреймворки, но это не специфический для React подход).
Репозиторий jsxstyle: https://github.com/jsxstyle/jsxstyle
jsxstyle предлагает указывать стили в inline-режиме, то есть не выносить их в отдельный объект, а писать прямо в пропсах компонентов. Библиотека предоставляет несколько готовых компонентов с уже предустановленными стилями отображения (
Block
, Inline
, Row
и т. п.). При этом скомпилированные стили не остаются инлайновыми, а превращаются в нормальные CSS-таблицы, а компонент трансформируется в обычный HTML-тег с каким-то уникальным классом.Пример: https://codesandbox.io/s/jsxstyle-react-junior-wn88n?file=/src/App.js
jsxstyle утверждает, что самое сложное в CSS - придумывать названия для классов, поэтому они полностью избавились от них, предоставив готовые блоки и максимально утилитарный стиль использования.
В целом, это немного другой способ "думать о стилях", чем те, которые мы разбирали ранее. Документация утверждает, что он проще и удобнее для работы и для оптимизации. 🤔
По умолчанию компоненты jsxstyle рендерятся в обычные дивы, но можно указать любой тег в пропе
component
. Атрибуты, которые не относятся к стилям и должны быть установлены прямо на HTML-элемент (вроде
placeholder
, type
) можно передать в пропе props
. Хотя в документации сказано, что такие свойства как placeholder
, type
, id
можно указывать и на верхнем уровне компонента, но у меня это почему-то не сработало.Поддерживаются псевдоэлементы и псевдоклассы. Чтобы задать, например, цвет плейсхолдера, нужно использовать свойство
placeholderColor
, а для изменения цвета при фокусе - focusColor
.Медиа-запросы тоже есть. Чтобы их использовать нужно указать список запросов в пропе
mediaQueries
, как объект, где у каждого запроса есть имя. Затем эти имена нужно использовать как префиксы для стилевых пропсов.В качестве альтернативы такому громоздкому синтаксису можно использовать хук
useMatchMedia
.В целом, мне не очень нравится образ мышления "jsxstyle", возможно, мой мозг для него еще просто не готов 🤯. Код получается, возможно, и более понятным (или нет), но уж точно намного более раздутым. Но что еще хуже, нет развернутой документации, только readme в репозитории. Так что дальше углубляться в jsxstyle, пожалуй, не буду.
#стили #jsxstyle #примерыкода
Telegram
React Junior
10 способов стилизации React-приложений
React не работает со стилями и не имеет предпочтений в том, как стилизовать приложение. Это значит, что мы можем действовать по своему усмотрению: можем писать инлайновый стили или по традиции подключать внешние файлы.…
React не работает со стилями и не имеет предпочтений в том, как стилизовать приложение. Это значит, что мы можем действовать по своему усмотрению: можем писать инлайновый стили или по традиции подключать внешние файлы.…
👍2👏1
Какой способ стилизации React-приложений вы предпочитаете?
Anonymous Poll
4%
Обычный CSS (только хардкор)
25%
Препроцессоры CSS (SCSS, Less)
29%
CSS Модули
13%
Styled Components
8%
React JSS
4%
Radium
0%
React Shadow
4%
JSX Style
4%
Утилитарные фреймворки (Tailwind)
8%
Что-то другое
CSS-переменные для React-разработчиков
Статья (англ.): https://www.joshwcomeau.com/css/css-variables-for-react-devs/
CSS-in-JS решения позволяют писать очень гибкие стили, но не следует забывать про нативные возможности CSS. Автор статьи считает, что CSS-переменные aka кастомные свойства - это очень мощный инструмент, который иногда может переплюнуть все эти ваши JS-интерполяции.
CSS-переменные дают возможность изменять значения, а не свойства. Они декларативны, и код с ними становится короче и чище. CSS-переменные наследуются вложенными элементами, а при необходимости с ними можно легко взаимодействовать из JS-кода. Ко всему прочему, с помощью переменных можно анимировать то, что нельзя анимировать другими способами, например, градиенты (с некоторыми оговорками).
В статье рассмотрен конкретный кейс обеспечения доступности кнопки на тач-устройствах - в двух вариантах: CSS-in-JS (Styled Components) и CSS-переменные.
В целом полностью поддерживаю мнение автора, CSS-переменные - очень мощная штука, к тому же нативная.
#стили #ссылки
Статья (англ.): https://www.joshwcomeau.com/css/css-variables-for-react-devs/
CSS-in-JS решения позволяют писать очень гибкие стили, но не следует забывать про нативные возможности CSS. Автор статьи считает, что CSS-переменные aka кастомные свойства - это очень мощный инструмент, который иногда может переплюнуть все эти ваши JS-интерполяции.
CSS-переменные дают возможность изменять значения, а не свойства. Они декларативны, и код с ними становится короче и чище. CSS-переменные наследуются вложенными элементами, а при необходимости с ними можно легко взаимодействовать из JS-кода. Ко всему прочему, с помощью переменных можно анимировать то, что нельзя анимировать другими способами, например, градиенты (с некоторыми оговорками).
В статье рассмотрен конкретный кейс обеспечения доступности кнопки на тач-устройствах - в двух вариантах: CSS-in-JS (Styled Components) и CSS-переменные.
В целом полностью поддерживаю мнение автора, CSS-переменные - очень мощная штука, к тому же нативная.
#стили #ссылки
Joshwcomeau
How to use CSS variables with React • Josh W. Comeau
CSS variables are *really* cool, and they're incredibly powerful when it comes to React! This tutorial shows how we can use them with React to create dynamic themes. We'll see how to get the most out of CSS-in-JS tools like styled-components, and how our…
👍1
По итогам опроса CSS Модули и препроцессоры вырвались вперед :) React JSS догоняет, остальные отстают.
Лично я также склоняюсь к комбинации модулей (для изоляции стилей) и препроцессоров (для удобства написания). Видимо, во мне живет консерватор, который любит писать стили в отдельном файлике в привычном виде, чтобы не засорять ими JS-код.
Из других решений мне более симпатичен React JSS. У Styled Components не нравится синтаксис, Radium кажется недоделанным, JSX Style избыточным, а React Shadow слишком радикальным.
#стили
Лично я также склоняюсь к комбинации модулей (для изоляции стилей) и препроцессоров (для удобства написания). Видимо, во мне живет консерватор, который любит писать стили в отдельном файлике в привычном виде, чтобы не засорять ими JS-код.
Из других решений мне более симпатичен React JSS. У Styled Components не нравится синтаксис, Radium кажется недоделанным, JSX Style избыточным, а React Shadow слишком радикальным.
#стили
👍4👏1
React Router
Так как в SPA переключение между страницами осуществляется без перезагрузки, необходимо какое-то решение для маршрутизации. Для этого в основном используется React Router.
В ноябре 2021 года вышла шестая мажорная версия этой библиотеки. В ней есть ряд изменений относительно предыдущей версии, поэтому старые статьи и руководства нужно читать с осторожностью.
Мы начнем знакомство с роутером с гайда Robin Wieruch (англ.): https://www.robinwieruch.de/react-router/
NPM-пакет, который нам нужен, называется react-router-dom, очевидно, эта реализация предназначена именно для работы в браузере. Разумеется, вся функциональность оформлена в виде React-компонентов и хуков.
🔷 Важные компоненты
🔸
Корневой компонент, внутри которого и происходит вся магия маршрутизации. Оборачивает все приложение (или ту его часть, где требуется управление роутингом).
🔸
Компонент-ссылка, используется вместо обычных
При нажатии на
🔸
Аналог
🔸
Компонент отдельного роута. Имеет проп
Если указанный роут совпадает с текущим, он рендерится.
Таким образом, атрибут
🔸
Обязательный контейнер для элементов
Внутри
🔸
Роуты должны быть единственными потомками компонента
🔷 Роуты
🔸 Без роута
У элемента
🔸 Index
Для обозначения корневого роута используется проп
🔸 Not Found
Если не один роут из списка не подошел, можно вывести запасной вариант - обычно это страница 404. Для этого в пропе
🔸 Динамические роуты
Если требуется передать в роуте какой-то динамический параметр, например, id товара на страницу каталога, в компоненте
Получить значение параметров можно с помощью хука
🔸 Вложенные роуты
Если роуты вложены друг в друга, то значения их путей складываются.
Внутри компонентов можно использовать относительные ссылки, они будут добавляться к текущему урлу, а не заменять его.
🔷 Программная навигация
Для программной навигации по роутам используется хук
🔷 Гет-параметры
В урле кроме основного пути могут быть еще дополнительные параметры запроса (search params). При необходимости их можно получить с помощью хука
Удобно использовать, например, для сохранения значений различных фильтров.
Кстати, в статье много полезных ссылок на другие материалы, которые тоже стоит почитать.
#ссылки #роутинг
Так как в SPA переключение между страницами осуществляется без перезагрузки, необходимо какое-то решение для маршрутизации. Для этого в основном используется React Router.
В ноябре 2021 года вышла шестая мажорная версия этой библиотеки. В ней есть ряд изменений относительно предыдущей версии, поэтому старые статьи и руководства нужно читать с осторожностью.
Мы начнем знакомство с роутером с гайда Robin Wieruch (англ.): https://www.robinwieruch.de/react-router/
NPM-пакет, который нам нужен, называется react-router-dom, очевидно, эта реализация предназначена именно для работы в браузере. Разумеется, вся функциональность оформлена в виде React-компонентов и хуков.
🔷 Важные компоненты
🔸
BrowserRouter
Корневой компонент, внутри которого и происходит вся магия маршрутизации. Оборачивает все приложение (или ту его часть, где требуется управление роутингом).
🔸
Link
Компонент-ссылка, используется вместо обычных
a
. Вместо атрибута href
есть проп to
.При нажатии на
Link
текущий урл изменяется, но перезагрузки не происходит.🔸
NavLink
Аналог
Link
, который знает о текущем активном роуте и может иметь "активное" состояние (класс .active
, а также проп `isActive`). Удобно использовать для главного меню сайта, чтобы выделять раздел, который пользователь просматривает в данный момент.🔸
Route
Компонент отдельного роута. Имеет проп
path
, содержимое которого сопоставляется с текущим урлом, и проп element
, в который нужно передать разметку, которая должна быть отрендерена. Если указанный роут совпадает с текущим, он рендерится.
Таким образом, атрибут
to
компонента Link
соответствует атрибуту path
компонента Route
.🔸
Routes
Обязательный контейнер для элементов
Route
, которых может быть сколько угодно. Внутри
Routes
всегда рендерится только один роут, первый подходящий. 🔸
Outlet
Роуты должны быть единственными потомками компонента
Routes
(еще могут быть React.Fragment), но их можно вкладывать друг в друга. При этом чтобы внутри родительского компонента отображались вложенные роуты (если они активны), используется компонент Outlet
(аналог `props.children`).🔷 Роуты
🔸 Без роута
У элемента
Route
может не быть пропа path
, например, если это компонент-обертка (`Layout`), которые оборачивает все роуты и выводится всегда.🔸 Index
Для обозначения корневого роута используется проп
index
. В этом случае path
указывать не нужно.🔸 Not Found
Если не один роут из списка не подошел, можно вывести запасной вариант - обычно это страница 404. Для этого в пропе
path
нужно указать *
.🔸 Динамические роуты
Если требуется передать в роуте какой-то динамический параметр, например, id товара на страницу каталога, в компоненте
Route
его нужно указать с помощью :
(`:productId`).Получить значение параметров можно с помощью хука
useParams
.🔸 Вложенные роуты
Если роуты вложены друг в друга, то значения их путей складываются.
Внутри компонентов можно использовать относительные ссылки, они будут добавляться к текущему урлу, а не заменять его.
🔷 Программная навигация
Для программной навигации по роутам используется хук
useNavigate
, который возвращает функцию navigate
. Чтобы перейти на какой-то роут, нужно просто передать его параметром в эту функцию.🔷 Гет-параметры
В урле кроме основного пути могут быть еще дополнительные параметры запроса (search params). При необходимости их можно получить с помощью хука
useSearchParams
. Он возвращает стандартный кортеж (массив значений) - первым идет сам объект с параметрами, а вторым - метод для его обновления.Удобно использовать, например, для сохранения значений различных фильтров.
Кстати, в статье много полезных ссылок на другие материалы, которые тоже стоит почитать.
#ссылки #роутинг
👍1👏1
Проект
Небольшой проект для закрепления материала: https://codesandbox.io/s/project-1-react-junior-oso5s?file=/src/App.js
Описание
Это демка интернет-магазина резиновых уточек.
Есть главная страница, на которой выводится ассортимент товаров. Каждый товар можно добавить в корзину или удалить, если он уже добавлен.
Есть, собственно, корзина, где отображается список добавленных товаров. Если кликнуть на товар в списке, рядом появится его развернутое представление с возможностью удалить из корзины.
Кроме того есть отдельная страничка с информацией о магазине.
Данные
Для симуляции получения данных с сервера используются методы
Стили
Для стилизации используется React JSS.
Приложение обернуто в
Маршрутизация
Для маршрутизации используется React Router. Все приложение обернуто в компонент
Главный компонент приложения -
- индексный - компонент
- роут about - компонент
- роут cart - компонент
- и вложенный в cart роут с динамическим параметром :productId - компонент
Также есть дефолтный роут *, связанный с компонентом
Все роуты обернуты в роут без пути, связанный с компонентом
Чтобы в компоненте Корзины мог отображаться вложенный компонент
В шапке есть маленькое навигационное меню, созданное с помощью компонентов
Программная навигация
При удалении товара из корзины роут программно изменяется.
Гет-параметры
На странице каталога есть поле поиска по товарам, оно синхронизируется с гет-параметром
Прочее
Для пробы добавлен кастомный хук
#роутинг #хуки #стили #примерыкода
Небольшой проект для закрепления материала: https://codesandbox.io/s/project-1-react-junior-oso5s?file=/src/App.js
Описание
Это демка интернет-магазина резиновых уточек.
Есть главная страница, на которой выводится ассортимент товаров. Каждый товар можно добавить в корзину или удалить, если он уже добавлен.
Есть, собственно, корзина, где отображается список добавленных товаров. Если кликнуть на товар в списке, рядом появится его развернутое представление с возможностью удалить из корзины.
Кроме того есть отдельная страничка с информацией о магазине.
Данные
Для симуляции получения данных с сервера используются методы
getProducts()
и getProduct(id)
. Список продуктов запрашивается в компоненте App
(внутри хука useEffect
). Состав корзины также хранится здесь.Стили
Для стилизации используется React JSS.
Приложение обернуто в
ThemeProvider
, в отдельных компонентах для получения темы используется хук useTheme
.Маршрутизация
Для маршрутизации используется React Router. Все приложение обернуто в компонент
BrowserRouter
. Главный компонент приложения -
App
. Здесь определяются все роуты:- индексный - компонент
Catalog
- роут about - компонент
About
- роут cart - компонент
Cart
- и вложенный в cart роут с динамическим параметром :productId - компонент
ProductView
Также есть дефолтный роут *, связанный с компонентом
NotFound
.Все роуты обернуты в роут без пути, связанный с компонентом
Layout
, который обеспечивает общую разметку.Чтобы в компоненте Корзины мог отображаться вложенный компонент
ProductView
, используется компонент Outlet
.В шапке есть маленькое навигационное меню, созданное с помощью компонентов
NavLink
. Они хранят состояние, активный роут выделяется цветом. Прочие навигационные ссылки сделаны с помощью Link
.Программная навигация
При удалении товара из корзины роут программно изменяется.
Гет-параметры
На странице каталога есть поле поиска по товарам, оно синхронизируется с гет-параметром
filter
с помощью хука useSearchParams
.Прочее
Для пробы добавлен кастомный хук
useFilteredList
.#роутинг #хуки #стили #примерыкода
👏1
Несколько статей
Несколько ссылок, надерганных из предыдущей статьи про роутер (все англ.):
🔸 Структура папок в React проекте за 5 шагов
https://www.robinwieruch.de/react-folder-structure/
Описано 5 способов группировки файлов по папкам в зависимости от размера проекта. От единственного файла, до разделения компонентов по доменам (отдельно компоненты, связанные с юзером, отдельно каталог и т.п.)
В целом ничего нового, но полезно, чтобы составить более оформленное представление.
🔸 CSS в React
https://www.robinwieruch.de/react-css-styling/
Еще один обзор разных способов стилизации приложений, большинство из которых мы уже довольно подробно разобрали. Способы разделены на три стратегии CSS-in-CSS, CSS-in-JS и Utility-First-CSS.
Заинтересовала именно последняя секция, про утилитарный CSS (Tailwind). Там куча разных классов, предполагается, что с их помощью можно настроить все, что нужно, без единой строчки CSS. Например, есть класс
🔸 Вложенные роуты в React Router 6
https://www.robinwieruch.de/react-router-nested-routes/
Более подробный разбор вложенных роутов. Это когда у вас есть, например, Личный Кабинет пользователя но роуте
Чтобы вложенный роут отображался внутри родительского, используется компонент
Вложенные роуты могут быть динамическими (например, id пользователя). В этом случае мы можем получить конкретное значение с помощью хука
🔸 Параметры поиска в React Router 6
https://www.robinwieruch.de/react-router-search-params/
Более подробный разбор работы с гет-параметрами. В React Router для этого есть хук useSearchParams, он возвращает актуальный объект URLSearchParams и позволяет изменять его. Чтобы было удобнее, можно написать собственный хук, который превращает URLSearchParams в обычный объект. Или можно воспользоваться уже готовым решением use-query-params.
#проект #роутинг #стили #ссылки
Несколько ссылок, надерганных из предыдущей статьи про роутер (все англ.):
🔸 Структура папок в React проекте за 5 шагов
https://www.robinwieruch.de/react-folder-structure/
Описано 5 способов группировки файлов по папкам в зависимости от размера проекта. От единственного файла, до разделения компонентов по доменам (отдельно компоненты, связанные с юзером, отдельно каталог и т.п.)
В целом ничего нового, но полезно, чтобы составить более оформленное представление.
🔸 CSS в React
https://www.robinwieruch.de/react-css-styling/
Еще один обзор разных способов стилизации приложений, большинство из которых мы уже довольно подробно разобрали. Способы разделены на три стратегии CSS-in-CSS, CSS-in-JS и Utility-First-CSS.
Заинтересовала именно последняя секция, про утилитарный CSS (Tailwind). Там куча разных классов, предполагается, что с их помощью можно настроить все, что нужно, без единой строчки CSS. Например, есть класс
py-2
, который устанавливает вертикальные паддинги, или border-solid
для стиля рамки. Выглядит ужасно, но может быть очень удобно для быстрого наброска/прототипирования/какого-нибудь небольшого демо-проекта. 🔸 Вложенные роуты в React Router 6
https://www.robinwieruch.de/react-router-nested-routes/
Более подробный разбор вложенных роутов. Это когда у вас есть, например, Личный Кабинет пользователя но роуте
/user
, а в нем две вкладки: Личные данные (`/user/personal`) и История заказов (`/user/orders`). Общая часть страницы отображается всегда, а какая именно вкладка будет видна - зависит от урла и является частью роутинга.Чтобы вложенный роут отображался внутри родительского, используется компонент
Outlet
.Вложенные роуты могут быть динамическими (например, id пользователя). В этом случае мы можем получить конкретное значение с помощью хука
useParams
.🔸 Параметры поиска в React Router 6
https://www.robinwieruch.de/react-router-search-params/
Более подробный разбор работы с гет-параметрами. В React Router для этого есть хук useSearchParams, он возвращает актуальный объект URLSearchParams и позволяет изменять его. Чтобы было удобнее, можно написать собственный хук, который превращает URLSearchParams в обычный объект. Или можно воспользоваться уже готовым решением use-query-params.
#проект #роутинг #стили #ссылки
www.robinwieruch.de
React Folder Structure in 5 Steps [2025]
React Folder Structure in 2025 for large React projects. The guide walks you through a file structure from small to large project ...
👍2
Документация React Router
Начинаем читать документацию React Router, чтобы узнать его получше.
https://reactrouter.com/docs/en/v6
Сначала общий обзор:
1. React Router DOM
В npm можно найти три пакета: react-router, react-router-dom и react-router-native. В первом находится ядро роутера, а два других - это конкретные реализации для браузера и для нативных приложений. React-router-dom и react-router-native уже импортируют все из react-router, поэтому нам не нужно использовать основной пакет.
2. Роутеры
Чтобы маршрутизация работала, нужно обернуть приложение в один из предоставленных корневых компонентов - роутеров. Для веба есть
3. Роуты
Есть два способа объявить роуты:
- прямо в JSX-разметке с помощью компонентов
- с помощью хука
4. Навигация
Можно управлять роутингом, то есть изменять текущий урл и, соответственно, отображаемые компоненты React. Для этого есть компоненты
5. Гет-параметры
Для работы с гет-параметрами урла предназначен хук
Для всех компонентов есть более низкоуровневый api, если вам нужна точная настройка и полный контроль.
#документация #роутинг
Начинаем читать документацию React Router, чтобы узнать его получше.
https://reactrouter.com/docs/en/v6
Сначала общий обзор:
1. React Router DOM
В npm можно найти три пакета: react-router, react-router-dom и react-router-native. В первом находится ядро роутера, а два других - это конкретные реализации для браузера и для нативных приложений. React-router-dom и react-router-native уже импортируют все из react-router, поэтому нам не нужно использовать основной пакет.
2. Роутеры
Чтобы маршрутизация работала, нужно обернуть приложение в один из предоставленных корневых компонентов - роутеров. Для веба есть
BrowserRouter
(уже использовали) и HashRouter
. Кроме того есть роутеры для серверного рендеринга, нативных приложений и тестирования, они нас пока не очень интересуют. Все роутеры обеспечивают контекст для работы остальных компонентов.3. Роуты
Есть два способа объявить роуты:
- прямо в JSX-разметке с помощью компонентов
Routes
и Route
- с помощью хука
useRoutes
из JS-кода4. Навигация
Можно управлять роутингом, то есть изменять текущий урл и, соответственно, отображаемые компоненты React. Для этого есть компоненты
Link
и NavLink
(аналоги обычных ссылок), а также компонент Navigate
и хук useNavigate
для программного управления.5. Гет-параметры
Для работы с гет-параметрами урла предназначен хук
useSearchParams
.Для всех компонентов есть более низкоуровневый api, если вам нужна точная настройка и полный контроль.
#документация #роутинг
Reactrouter
Docs v6.30.1
Роутеры
BrowserRouter
Стандартный роутер для маршрутизации в браузере. Использует History API для управлния урлом и изменения текущего роута. По умолчанию работает с текущим окном, но это можно изменить с помощью пропа
Hash Router
Компонент
Memory Router
MemoryRouter хранит всю информацию в обычном массиве и не связан с внешними api. Его удобно использовать для тестирования. У него есть пропсы
#документация #роутинг
BrowserRouter
Стандартный роутер для маршрутизации в браузере. Использует History API для управлния урлом и изменения текущего роута. По умолчанию работает с текущим окном, но это можно изменить с помощью пропа
window
.Hash Router
Компонент
HashRouter
- это альтернатива BrowserRouter
, которая контролирует не весь урл веб-страницы, а только его хеш. Документация не рекомендует использовать этот тип маршрутизации без крайней необходимости, если вы почему-то не можете отправлять урл на сервер.Memory Router
MemoryRouter хранит всю информацию в обычном массиве и не связан с внешними api. Его удобно использовать для тестирования. У него есть пропсы
initialEntries
(принимает массив строк) и initialIndex
(принимает число), с помощью которых можно установить "исходную" историю маршрутизации.#документация #роутинг
👍1
Современный технический стек React: самые популярные инструменты
Статья (англ.): https://profy.dev/article/react-tech-stack
Обзор самых популярных инструментов в экосистеме React для решения самых разных задач: от обработки форм до тестирования. Будет полезен начинающим разработчикам, у которых (как у меня) глаза разбегаются, и непонятно, за что хвататься.
Оценка популярности базируется в основном на количестве загрузок в npm, но учитываются и другие источники информации (например, опрос State of JS).
🔶 1. Библиотеки
Next.js - самый популярный React-фреймворк.
Redux - самый популярный стейт-менеджер.
react-query - самая популярная библиотека для запроса данных (или Apollo для проектов, использующих GraphQL).
React Hook Form - самая популярная библиотека для работы с формами.
styled-components и MUI - самые популярные библиотеки для работы со стилями (MUI - библиотека компонентов)
🔶 2. Инструменты разработки
Prettier - для форматирования кода.
ESLint - для статического анализа кода и отлова плохих паттернов.
TypeScript - для проверки типов.
🔶 3. Тестирование
Jest - самый популярный фреймворк для тестирования (в основном юнит-тесты).
React Testing Library - самая популярная библиотека для интеграционного тестирования.
Cypress - самый популярный инструмент для e2e-тестирвания.
Storybook - самый популярный инструмент для тестирования и документации интерфейса.
🔶 4. Workflow
Trunk Based Development - самая распространенная модель разработки, основанная на Git. Для Continuous Integration используются GitHub Actions. Схема довольно простая:
- новая ветка создается от главной
- код пушится в репозиторий
- открывается пулл-реквест
- запускаются все проверки (линтер, проверка типов, тесты)
- проводится код-ревью
- ветка мержится в главную
🟢 Дорожная карта
В заключение автор предлагает "дорожную карту" для погружения в React-экосистему:
1. Разобраться в Trunk Based Development.
2. Начать использовать Next.js.
3. (Опционально) Изучить TypeScript.
4. Использовать ESLint и Prettier.
5. Разобраться в styled-components или MUI для стилизации.
6. Писать тесты с помощью Cypress.
7. (Опционально) Redux.
8. (Опционально) Storybook.
#ссылки #тестирование #стили #инструменты
Статья (англ.): https://profy.dev/article/react-tech-stack
Обзор самых популярных инструментов в экосистеме React для решения самых разных задач: от обработки форм до тестирования. Будет полезен начинающим разработчикам, у которых (как у меня) глаза разбегаются, и непонятно, за что хвататься.
Оценка популярности базируется в основном на количестве загрузок в npm, но учитываются и другие источники информации (например, опрос State of JS).
🔶 1. Библиотеки
Next.js - самый популярный React-фреймворк.
Redux - самый популярный стейт-менеджер.
react-query - самая популярная библиотека для запроса данных (или Apollo для проектов, использующих GraphQL).
React Hook Form - самая популярная библиотека для работы с формами.
styled-components и MUI - самые популярные библиотеки для работы со стилями (MUI - библиотека компонентов)
🔶 2. Инструменты разработки
Prettier - для форматирования кода.
ESLint - для статического анализа кода и отлова плохих паттернов.
TypeScript - для проверки типов.
🔶 3. Тестирование
Jest - самый популярный фреймворк для тестирования (в основном юнит-тесты).
React Testing Library - самая популярная библиотека для интеграционного тестирования.
Cypress - самый популярный инструмент для e2e-тестирвания.
Storybook - самый популярный инструмент для тестирования и документации интерфейса.
🔶 4. Workflow
Trunk Based Development - самая распространенная модель разработки, основанная на Git. Для Continuous Integration используются GitHub Actions. Схема довольно простая:
- новая ветка создается от главной
- код пушится в репозиторий
- открывается пулл-реквест
- запускаются все проверки (линтер, проверка типов, тесты)
- проводится код-ревью
- ветка мержится в главную
🟢 Дорожная карта
В заключение автор предлагает "дорожную карту" для погружения в React-экосистему:
1. Разобраться в Trunk Based Development.
2. Начать использовать Next.js.
3. (Опционально) Изучить TypeScript.
4. Использовать ESLint и Prettier.
5. Разобраться в styled-components или MUI для стилизации.
6. Писать тесты с помощью Cypress.
7. (Опционально) Redux.
8. (Опционально) Storybook.
#ссылки #тестирование #стили #инструменты
profy.dev
Most Popular React Tech Stack in 2023 (Based on Data)
The React ecosystem is huge so it's hard to keep an overview. Based on data here is a list of the most popular React libs used in 2022.
👍1
React Router. Навигация
Link
Роут указывается в пропе
По умолчанию смена роута происходит без перезагрузки страницы, но это поведение можно отменить с помощью пропа
NavLink
Навигационная ссылка с состоянием "активности". Если роут такой ссылки соответствует текущему роуту приложения, она помечается классом
Кроме того, в атрибут
И наконец, функцию можно передать в качестве дочернего элемента ссылки, чтобы рендерить динамический контент.
Примеры: https://codesandbox.io/s/navlink-react-junior-8g1xen
Кроме того, есть проп
Например, у нас есть ссылка, ведущая на роут
Navigate
Это способ управлять роутингом прямо из JSX-разметки, без JS-кода.
Если компонент
В документации в качестве примера приводится форма авторизации.
Мой вариант: https://codesandbox.io/s/navigate-react-junior-mrp48r?file=/src/pages/Login.js
У нас есть два роута, индексный с формой авторизации и
#роутинг #примерыкода
Link
Роут указывается в пропе
to
. Допускаются "относительные" ссылки (у которых в начале нет /
), они работают относительно текущего роута (все как у обычных ссылок).По умолчанию смена роута происходит без перезагрузки страницы, но это поведение можно отменить с помощью пропа
reloadDocument
(только зачем?).NavLink
Навигационная ссылка с состоянием "активности". Если роут такой ссылки соответствует текущему роуту приложения, она помечается классом
active
.Кроме того, в атрибут
style
и в атрибут className
элемента NavLink
можно передать функцию. В качестве параметра она получает объект с полем isActive
. Так можно устанавливать динамические стили.И наконец, функцию можно передать в качестве дочернего элемента ссылки, чтобы рендерить динамический контент.
Примеры: https://codesandbox.io/s/navlink-react-junior-8g1xen
Кроме того, есть проп
end
, который убирает активность ссылки, если активен дочерний по отношению к ней роут. Например, у нас есть ссылка, ведущая на роут
/catalog
, а текущий активный роут /catalog/pizza
. По умолчанию ссылка будет активна, но проп end
может это изменить.Navigate
Это способ управлять роутингом прямо из JSX-разметки, без JS-кода.
Если компонент
Navigate
рендерится, то происходит изменение роута. То есть он всегда используется с некоторым условием. Под капотом у него используется хук useNavigate
, пропсы соответствуют параметрам этого хука (to
, replace
).В документации в качестве примера приводится форма авторизации.
Мой вариант: https://codesandbox.io/s/navigate-react-junior-mrp48r?file=/src/pages/Login.js
У нас есть два роута, индексный с формой авторизации и
/account
. При отправке формы происходит базовая валидация полей, затем данные отправляются на сервер. Если пользователь успешно авторизован, то мы рендерим компонент Navigate
с пропом to=/account
- происходит переход на страницу Личного кабинета.#роутинг #примерыкода
CodeSandbox
NavLink. React Junior - CodeSandbox
NavLink. React Junior by furrycat.web using react, react-dom, react-router-dom, react-scripts
React Router. Outlet
Компонент
https://codesandbox.io/s/outlet-react-junior-d08y8s?file=/src/App.js
Например, есть роут
Чтобы дочерние роуты выводились, нужно вставить
Контекст
Родительский компонент может передавать в дочерние роуты какие-либо данные через проп
Чтобы получить эти данные в дочернем компоненте, нужно использовать хук
#роутинг #примерыкода
Компонент
Outlet
нужен, усли в приложении есть вложенные роуты. Он используется в родительском роуте в том месте, где нужно вывести контент дочернего роута. Это аналог пропа children
для роутов.https://codesandbox.io/s/outlet-react-junior-d08y8s?file=/src/App.js
Например, есть роут
/profile
, который представляет личный кабинет пользователя. С ним связан компонент Profile
, который рендерит общую информацию о пользователе, а также вкладки Заказы и Баллы лояльности. Каждая вкладка - это отдельный дочерний роут - /profile/orders
и profile/loyalty
, с каждым из которых связан свой компонент. Чтобы дочерние роуты выводились, нужно вставить
Outlet
в нужном месте компонента Profile
.Контекст
Родительский компонент может передавать в дочерние роуты какие-либо данные через проп
context
элемента Outlet
. Таким образом можно поднять состояние из дочерних роутов в родительский. В примере так передается количество баллов лояльности. Чтобы получить эти данные в дочернем компоненте, нужно использовать хук
useOutletContext
.#роутинг #примерыкода
CodeSandbox
Outlet. React Junior - CodeSandbox
Outlet. React Junior by furrycat.web using react, react-dom, react-router-dom, react-scripts, styled-components
React Router. Вспомогательные функции
Помимо рассмотренных компонентов и хуков, в пакете React Router есть еще ряд вспомогательных функций, которые используются для матчинга роутов и текущего урла, рендера активного роута и т.д. Они используются под капотом, но при необходимости, можно использовать их напрямую.
Их можно найти в документации на страничке с описанием API: https://reactrouter.com/docs/en/v6/api#api-reference
Если при дальнейшем изучении что-то из этого понадобится, то мы сюда вернемся.
#документация #роутинг
Помимо рассмотренных компонентов и хуков, в пакете React Router есть еще ряд вспомогательных функций, которые используются для матчинга роутов и текущего урла, рендера активного роута и т.д. Они используются под капотом, но при необходимости, можно использовать их напрямую.
Их можно найти в документации на страничке с описанием API: https://reactrouter.com/docs/en/v6/api#api-reference
Если при дальнейшем изучении что-то из этого понадобится, то мы сюда вернемся.
#документация #роутинг
Reactrouter
API Reference v6.3.0