18 марта 2024 г. (изменено: 18 марта 2024 г.)
Канал: @cherkashindev
⚛️ React 19 — useOptimistic
useOptimistic — новый хук, который позволяет отобразить “оптимистичное” состояние. Оно называется “оптимистичным”, потому что мы “оптимистично” надеемся, что наш запрос не свалится с ошибкой и после выполнения запроса состояние будет выглядеть именно так.
❓Как используется
- В
useOptimisticпередаётся реальное состояние (cart) и функцию-reducer, для обновления оптимистичного состояния - Компонент (
Cart) использует “оптимистичное” состояние (optimisticCart) для рендера - Перед выполнением запроса обновляется “оптимистичное” состояние
- Когда запрос завершился, нужно обновить реальное состояние
- Как только реальное состояние обновилось, оптимистичное состояние обновится автоматически, так как оно передано в
useOptimisticпервым параметром. ⚠️ Поэтому важно следить, чтобы приходило одно и то же состояние. - Если запрос упал с ошибкой, нужно откатить изменения в оптимистичном состоянии.
ℹ️ Первый вопрос, которым я задался, а в чём отличие от обычного setState, путём экспериментов, вот что удалось найти:
useOptimisticработает с формами. Работать с обычной кнопкой в Single Page Application мне не удалось, обновление происходило только после завершения запросаuseOptimisticработает только внутри асинхронного обработчика, что логично. Если убратьasync/await, обновление произойдёт только после завершения запроса- Параметр в
useStateиспользуется только для инициализации, и игнорируется в последующих рендерах.useOptimisticбудет сихронизироваться со значением переданным первым параметром.
🤷♂️ Очень мало полезного удалось найти о useOptimistic. Во всех статьях и видео тривиальные примеры, нигде не рассказывается как обрабатывать более сложные ситуации:
- Как обновлять оптимистичное состояние, если запустить несколько запросов одновременно?
- Как использовать
useOptimisticв SPA вне форм?
Поэтому пришлось создать пару ишью: раз и два. В любом случае, пока useOptimistic выглядит каким-то низкоуровневым API. Надеюсь скоро появится больше Best Practices по его применению. Если вам есть что добавить — пишите в комментах.
Ещё по теме: