Как стать автором
Обновить
30.9

ReactJS *

JavaScript-библиотека для создания интерфейсов

Сначала показывать
Порог рейтинга

⚛️ React 19 — use(Promise)

use — новый хук, который позволяет считывать данные из промиса и при этом интегрирован с Suspense и ErrorBoundary.

Основные моменты:

  • На этот хук не распространяются правила хуков — его можно использовать внутри циклов и условных операторов.

  • Если мы используем хук use(Promise), то где-то в родительском компоненте мы должны положить сам промис (не данные как мы делали раньше) в стейт (useState). Это позволяет избавиться от useEffect’а, который был нужен, чтобы запросить данные при первом рендере.

  • Хук интегрирован с Suspense, поэтому пока промис не разрезолвится — будет показан fallback объявленный в ближайшем Suspense.

  • Если промис зареджектился, то будет показан fallback объявленный в ближайшем ErrorBoundary.

Материалы

https://t.me/cherkashindev/182

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

React — Compound Components

Как-то я уже упоминал паттерн Compound Components (Составные компоненты) для React, теперь остановимся на нём немного подробнее.

ℹ️ Compound components — это подход позволяет объединить несколько компонентов в единую сущность, которая неявно имеет общее состояние. Эти компоненты тесно взаимодействуют друг с другом и работают как единое целое, представляя собой полноценный UI компонент.

? Основные характеристики:

  • Используется React контекст, чтобы управлять состоянием

  • Должен быть главный компонент, в котором хранится состояние и объявляется React контекст

  • Все дочерние компоненты используют состояние через React контекст

ℹ️ Он состоит из 2 простых подходов React:

  1. Композиция компонентов

  2. Паттерн “Провайдер” — использование контекста React 

? Вначале рассмотрим подходы по отдельности

1️⃣ Что такое композиция?

Вместо вот этого 

<Tile count={money} title="Стоимость" icon={<MoneyIcon/>}/>

Мы пишем вот так

<Tile>
  <Title>{title}</Title>
  <Number>{count}</Number>
  <Icon>{icon}</Icon>
</Tile>

2️⃣ Паттерн “Провайдер” 

Здесь идёт речь об обычном использовании контекста реакта, чтобы передавать какие-то данные на любую глубину дерева компонентов, минуя дочерние компоненты. 

? Если объединить два этих подхода, то сможем реализовать паттерн Compound Components. Как пример, можно использовать компонент табов из библиотеки material-ui.

https://t.me/cherkashindev/166

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Препарируем StyleX и находим родовые травмы

Решение от большой компании, но..

  • Раздутый как CSS, так и HTML, и даже JS

  • Несемантичный CSS и HTML

  • Околонулевая типизация без автодополнения

  • Много бойлерплейта

  • Зависимость от Babel

  • Тормозная сборка

  • Сложная отладка

Копилка благодарностей: https://boosty.to/hyoo

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

⚛️ Атомарные обновления в Zustand

Я уже упоминал атомарные обновления, когда говорил о проблемах контекста реакта.

Я называю обновления атомарными, если компонент обновляется только тогда, когда изменяются данные, которые он использует. У контекста реакта с этим большие проблемы, но и при использовании Zustand можно выстрелить себе в ногу.

Zustand сравнивает по ссылке предыдущее и текущее значение, возвращаемое из useStore(), и если объект изменился — происходит ре-рендер. 

❌ В следующем примере у нас всегда будет возвращаться новый объект, и ре-рендер произойдёт даже если изменился только age, а lastName и firstName не изменились

const {firstName, lastName} = useStore(({firstName, lastName}) => ({firstName, lastName}));

Аналогичное поведение будет и в следующем случае

const {firstName, lastName} = useStore();

✅ Есть три варианта использования значений из стейта, которые поддерживают атомарные обновления:

1️⃣ Одиночные селекторы

const firstName = useStore((state) => state.firstName)

const lastName = useStore((state) => state.lastName)

2️⃣ Селектор, который возвращает объект + shallow - функция сравнения предыдущего и нового стейтов

const {firstName, lastName} = useStore(({firstName, lastName}) => ({

    firstName, 

    lastName

}), shallow);

3️⃣ Автосгенерированных селекторы

const firstName = useStore.use.firstName();

const lastName = useStore.use.lastName();

Накидал небольшую демку в Codesandbox

#frontend #react #statemanagement #zustand

Теги:
Рейтинг0
Комментарии0

В 3 раза (на 70%) быстрее React, но..

  • у вас не должно быть логики в компонентах

  • вы не должны использовать компоненты

  • у вас будет куча WTF ограничений

  • у вас не будет статической типизации

Всего голосов 6: ↑3 и ↓30
Комментарии0
2