Redux Essentials 25. RTK Query. Потоковое обновление кеша
И наконец, осталось только переделать уведомления.
В реально приложении этот функционал скорее всего будет реализован с помощью сокетов. Получаем исходный список уведомлений, а дальше подписываемся на сокет-канал и ждем новых сообщений.
https://codesandbox.io/s/redux-essentials-rtk-query-7-react-junior-uzedjr?file=/src/features/notifications/notificationsSlice.js
Для демонстрационных целей напишем фейковый сокет-сервер, который будет через некоторый интервал генерировать новые уведомления.
Создание эндпоинта
Создадим новый эндпоинт
Экспортируем хук
Подписка на новые уведомления
У эндпоинта есть метод жизненного цикла
Внутри этого метода мы можем подписаться на сокет-канал.
Метод принимает два параметра:
Последовательность действий:
- ждем, пока выполнится основной запрос (
- подписываемся на сокет-канал, при получении новых уведомлений добавляем их к кешированным ранее данным (
- отслеживаем удаление кеша (
Непрочитанные уведомления
Теперь список уведомлений хранится в
При добавлении новых уведомлений в кеш, нужно добавлять их и в
В
Осталось только в компоненте
#redux #управлениесостоянием #rtkquery #обменданными #документация #примерыкода
И наконец, осталось только переделать уведомления.
В реально приложении этот функционал скорее всего будет реализован с помощью сокетов. Получаем исходный список уведомлений, а дальше подписываемся на сокет-канал и ждем новых сообщений.
https://codesandbox.io/s/redux-essentials-rtk-query-7-react-junior-uzedjr?file=/src/features/notifications/notificationsSlice.js
Для демонстрационных целей напишем фейковый сокет-сервер, который будет через некоторый интервал генерировать новые уведомления.
Создание эндпоинта
Создадим новый эндпоинт
getNotifications
, который будет получать исходный список. Для удобства вынесем его в файл notificationsSlice.js
и подключим с помощью метода apiSlice.injectEndpoints
.Экспортируем хук
useGetNotificatinsQuery
и используем его в компоненте NotificationsList
. Тут ничего нового.Подписка на новые уведомления
У эндпоинта есть метод жизненного цикла
onCacheEntryAdded
. Он вызывается в тот момент, когда эндпоинт добавляется в кеш, то есть для него "бронируется" там место (данные при этом еще не получены).Внутри этого метода мы можем подписаться на сокет-канал.
Метод принимает два параметра:
arg
и thunkApi
. В последнем есть несколько полезных методов и данных:const {
updateCachedData,
cacheDataLoaded,
cacheEntryRemoved,
dispatch
} = thunkApi;
Последовательность действий:
- ждем, пока выполнится основной запрос (
cacheDataLoaded
)- подписываемся на сокет-канал, при получении новых уведомлений добавляем их к кешированным ранее данным (
updateCachedData
)- отслеживаем удаление кеша (
cacheEntryRemoved
), закрываем каналНепрочитанные уведомления
Теперь список уведомлений хранится в
apiSlice
. Но нам еще нужно хранить их состояние (непрочитанные/прочитанные). Используем для этого уже существующий notificationsSlice
, только вместо самих уведомлений поместим туда данные об их состоянии.При добавлении новых уведомлений в кеш, нужно добавлять их и в
notificationsSlice
. Добавление происходит при выполнении базового запроса (экшен extendedApi.endpoints.getNotifications.matchFulfilled
), а также при получении новых данных через сокет. Для второго случая создадим отдельный экшен notificationsReceived
(используем утилитарную функцию createAction
).В
extraReducers
отслеживаем нужные экшены (builder.addMatcher
) и добавляем новые элементы в список.Осталось только в компоненте
NotificationsList
получить состояние уведомлений и отметить их как нужно.#redux #управлениесостоянием #rtkquery #обменданными #документация #примерыкода
CodeSandbox
Redux Essentials. RTK Query 7. React Junior - CodeSandbox
Redux Essentials. RTK Query 7. React Junior by furrycat.web using @reduxjs/toolkit, date-fns, react, react-dom, react-redux, react-router-dom, react-scripts, styled-components
👍1
RTK Query. Резюме
Небольшое подведение итогов по RTK Query после прохождения руководства.
RTK Query работает поверх Redux Toolkit, используя его основные концепции.
Предполагается, что вся работа с API в проекте будет собрана в отдельный слайс, созданный с помощью функции
Эндпоинт может быть запросом (query) или мутацией (mutation).
У каждого эндпоинта есть поле
При необходимости, часть эндпоинтов можно перенести в отдельный файл и подключить к слайсу через
Все полученные данные хранятся в кеше. Если на эндпоинт нет подписок, его кеш через некоторое время сбрасывается.
Каждый эндпоинт можно пометить тегом (строка или объект), который можно инвалидировать (принудительно сбросить кеш и вызвать перезапуск запроса) в другом эндпоинте (уточненные теги).
Для эндпоинта генерируется хук (хуки запросов https://yangx.top/react_junior/342), который можно использовать в компонентах. Результат работы хука помимо данных содержит информацию о статусе запроса (`isFetching`,
Можно работать с эндпоинтами и без хуков, они предоставляют ряд методов (`initiate()`, `select()`) (ручная работа с эндпоинтами).
RTK Query поддерживает оптимистичные обновления кеша, для этого используем метод жизненного цикла
Кроме того, возможно обновление кеша "по необходимости", например, при подписке на сокет-канал (потоковое обновление кеша). Для этого используем метод жизненного цикла
#redux #rtkquery #обменданными
Небольшое подведение итогов по RTK Query после прохождения руководства.
RTK Query работает поверх Redux Toolkit, используя его основные концепции.
Предполагается, что вся работа с API в проекте будет собрана в отдельный слайс, созданный с помощью функции
createApi
. Тут можно настроить, как именно должен выполняться запрос (`baseQuery`), а также указать набор эндпоинтов (`endpoints`).Эндпоинт может быть запросом (query) или мутацией (mutation).
У каждого эндпоинта есть поле
query
, формирующее урл запроса. Полученный ответ можно обработать в методе transformResponse
. Кроме того, можно форматировать данные прямо в компоненте (три подхода к форматированию данных)При необходимости, часть эндпоинтов можно перенести в отдельный файл и подключить к слайсу через
apiSlice.injectEndpoints
(разделение эндпоинтов).Все полученные данные хранятся в кеше. Если на эндпоинт нет подписок, его кеш через некоторое время сбрасывается.
Каждый эндпоинт можно пометить тегом (строка или объект), который можно инвалидировать (принудительно сбросить кеш и вызвать перезапуск запроса) в другом эндпоинте (уточненные теги).
Для эндпоинта генерируется хук (хуки запросов https://yangx.top/react_junior/342), который можно использовать в компонентах. Результат работы хука помимо данных содержит информацию о статусе запроса (`isFetching`,
isLoading
, `isError`). Кроме того, хук может принимать параметры для автоматического перезапроса данных и для выборки нужных данных из кеша (`selectFromResult`) (параметры хука запроса).Можно работать с эндпоинтами и без хуков, они предоставляют ряд методов (`initiate()`, `select()`) (ручная работа с эндпоинтами).
RTK Query поддерживает оптимистичные обновления кеша, для этого используем метод жизненного цикла
onQueryStarted
и метод обновления apiSlice.util.updateQueryData
.Кроме того, возможно обновление кеша "по необходимости", например, при подписке на сокет-канал (потоковое обновление кеша). Для этого используем метод жизненного цикла
onCacheEntryAdded
.#redux #rtkquery #обменданными
Telegram
React Junior
Redux Essentials 16. RTK Query. Выполнение запросов
Проект: https://codesandbox.io/s/redux-essentials-rtk-query-react-junior-lced2j?file=/src/features/api/apiSlice.js
baseQuery
Основная (обязательная) настройка в методе createApi - это baseQuery. Это функция…
Проект: https://codesandbox.io/s/redux-essentials-rtk-query-react-junior-lced2j?file=/src/features/api/apiSlice.js
baseQuery
Основная (обязательная) настройка в методе createApi - это baseQuery. Это функция…
👍4
RTK Query
Освежаю знания об RTK Query
RTK Query - это часть Redux Toolkit, которая предназначена для удобной работы с API. Она собирает все, что относится к API в одном месте и дает нам много приятного синтаксического сахара.
Заводим для API отдельный слайс, где будут лежать все данные, полученные с сервера. Но не обычный слайс, который
Подключить этот api-слайс к стору посложнее, чем обычный, тут нужно и редьюсер добавить, и специальный миддлвар.
В api-слайсе определяем функцию, которая будет осуществлять запросы -
На этом техническая подготовка заканчивается и начинается собственно логика обмена данными - поле
Примечание: можно выполнить запрос и «вручную» без использования хука.
Отправка данных на сервер работает практически так же, как и вытягивание, только эндпоинт нужно немного по-другому оформить (через `builder.mutation`). Хук тоже немного другой.
Самое приятное, что запросы к серверу кешируются, однако кеш иногда приходится сбрасывать. Это можно сделать напрямую руками, с помощью метода
Конечно, api-слайс можно расчленять (injectEndpoints).
RTK Query предлагает продвинутые техники работы с API, например, оптимистичное обновление, когда данные меняются сразу, а запрос выполняется уже в фоне. Еще есть возможность подписаться на источник событий (сокет-канал) , чтобы получать данные из него.
Предыдущее резюме по RTK Query, с большим количество технических подробностей.
#управлениесостоянием #rtkquery #обменданными
Освежаю знания об RTK Query
RTK Query - это часть Redux Toolkit, которая предназначена для удобной работы с API. Она собирает все, что относится к API в одном месте и дает нам много приятного синтаксического сахара.
Заводим для API отдельный слайс, где будут лежать все данные, полученные с сервера. Но не обычный слайс, который
createSlice
, а прокачанный слайс, который createApi
.Подключить этот api-слайс к стору посложнее, чем обычный, тут нужно и редьюсер добавить, и специальный миддлвар.
В api-слайсе определяем функцию, которая будет осуществлять запросы -
baseQuery
.На этом техническая подготовка заканчивается и начинается собственно логика обмена данными - поле
endpoints
. Тут мы получаем builder
и с его помощью (`builder.query`) создаем массив наших эндпоинтов (есть много разных настроек) . Каждый эндпоинт на выходе из слайса создает себе личный хук , который можно дернуть в любом месте приложения. А в этом хуке уже предусмотрена куча удобных поле - data
, isLoading
, error
и т.п. И дополнительно можно закинуть ряд настроек, вроде селектора . То есть вытаскивать данные из API со всеми удобствами мы уже можем. Можно даже сочетать все это дело с EnitityAdapter. Примечание: можно выполнить запрос и «вручную» без использования хука.
Отправка данных на сервер работает практически так же, как и вытягивание, только эндпоинт нужно немного по-другому оформить (через `builder.mutation`). Хук тоже немного другой.
Самое приятное, что запросы к серверу кешируются, однако кеш иногда приходится сбрасывать. Это можно сделать напрямую руками, с помощью метода
refetch
, который есть в хуках. Но лучше настроить зависимости с помощью системы тегов, чтобы RTK Query сбрасывала то, что нужно, самостоятельно. Конечно, api-слайс можно расчленять (injectEndpoints).
RTK Query предлагает продвинутые техники работы с API, например, оптимистичное обновление, когда данные меняются сразу, а запрос выполняется уже в фоне. Еще есть возможность подписаться на источник событий (сокет-канал) , чтобы получать данные из него.
Предыдущее резюме по RTK Query, с большим количество технических подробностей.
#управлениесостоянием #rtkquery #обменданными
Telegram
React Junior
Redux Essentials 16. RTK Query. Создание слайса
RTK Query - это еще один уровень абстракции над абстракциями Redux, позволяющий инкапсулировать работу с API: методы получения/обновления/удаления данных, состояние выполнения запроса, синхронизация состояния…
RTK Query - это еще один уровень абстракции над абстракциями Redux, позволяющий инкапсулировать работу с API: методы получения/обновления/удаления данных, состояние выполнения запроса, синхронизация состояния…
🔥3👍2