0Pricing
React Academy · Урок

Оптимистичные обновления и аннулирование кэша

Мгновенно обновляйте интерфейс при мутации и аннулируйте кэшированные данные с помощью тегов.

«Оптимистичные обновления и аннулирование кэша» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке Вы создадите конечные точки мутаций в RTK Query, мгновенно обновите интерфейс с помощью оптимистичных обновлений и инвалидируете устаревшие записи кэша с помощью тегов.

Конечные точки мутаций

Определяйте мутации с помощью builder.mutation(). Мутации изменяют данные на сервере (POST, PUT, DELETE) и возвращают хук useMutation.
export const userApi = createApi({
  /* ... */
  endpoints: (builder) => ({
    updateUser: builder.mutation({
      query: ({ id, ...body }) => ({
        url: '/users/' + id,
        method: 'PUT',
        body,
      }),
    }),
  }),
});

Использование хука мутации

Деструктурируйте [trigger, result] из хука мутации. Вызовите trigger() с аргументом мутации. result содержит isLoading, isSuccess и isError.
const [updateUser, { isLoading }] = useUpdateUserMutation();

const handleSave = async () => {
  await updateUser({ id: 1, name: 'Alice' });
};

Теги кэша для инвалидации

Теги связывают кэшированные данные запросов с мутациями. Определяйте `providesTags` для запросов и `invalidatesTags` для мутаций. Когда выполняется мутация, RTK Query автоматически повторяет все запросы, предоставившие инвалидированные теги.
endpoints: (builder) => ({
  getUsers: builder.query({
    query: () => '/users',
    providesTags: ['User'],
  }),
  deleteUser: builder.mutation({
    query: (id) => ({ url: '/users/' + id, method: 'DELETE' }),
    invalidatesTags: ['User'],
  }),
})

Точная инвалидация тегов

Используйте объекты тегов с идентификатором для более точной инвалидации. Укажите тег конкретного пользователя в getUser и инвалидируйте при updateUser только кэш этого пользователя.
providesTags: (result, error, id) => [{ type: 'User', id }],
invalidatesTags: (result, error, { id }) => [{ type: 'User', id }]

Оптимистичные обновления с onQueryStarted

Используйте onQueryStarted в мутации, чтобы немедленно обновить кэш до ответа сервера, а затем откатить обновление, если мутация завершится ошибкой.
updateUser: builder.mutation({
  query: (user) => ({ url: '/users/' + user.id, method: 'PUT', body: user }),
  async onQueryStarted(user, { dispatch, queryFulfilled }) {
    const patch = dispatch(
      userApi.util.updateQueryData('getUser', user.id, draft => {
        Object.assign(draft, user);
      })
    );
    try { await queryFulfilled; }
    catch { patch.undo(); } // roll back on error
  },
})

Инвалидация всех экземпляров типа тега

Использование `{ type: 'User', id: 'LIST' }` в качестве тега для запросов списков позволяет инвалидировать весь список, не затрагивая отдельные записи пользователей.
providesTags: result =>
  result ? [
    ...result.map(({ id }) => ({ type: 'User', id })),
    { type: 'User', id: 'LIST' },
  ] : [{ type: 'User', id: 'LIST' }]

Ручная инвалидация кэша

Программно инвалидируйте определённые теги с помощью dispatch(api.util.invalidateTags(['User'])). Это полезно в обработчиках событий, находящихся за пределами компонентов.
dispatch(userApi.util.invalidateTags(['User']));

Пессимистичные и оптимистичные обновления

Оптимистичное обновление: изменяет кэш до ответа сервера, мгновенно обновляя интерфейс и выполняя откат при ошибке. Пессимистичное обновление: ожидает ответа сервера и только затем изменяет данные, что безопаснее, но медленнее. Выбирайте подход с учётом риска сбоя мутации.

Когда использовать теги, а когда ручной повторный запрос

Используйте теги, когда точно знаете, какие запросы нужно инвалидировать. Для разового ручного обновления используйте refetch() из хука запроса. Теги лучше автоматизируются и масштабируются для больших API.

Быстрая проверка

Что делает invalidatesTags в конечной точке мутации RTK Query?

Итоги

Определяйте мутации с помощью builder.mutation. Используйте providesTags для запросов и invalidatesTags для мутаций, чтобы автоматически повторять запросы. Для оптимистичных обновлений применяйте onQueryStarted вместе с updateQueryData, а для отката — undo().

Курс завершён

Поздравляем! Вы завершили курс **Redux Toolkit и RTK Query**. Теперь Вы умеете создавать срезы Redux, обрабатывать асинхронную логику с помощью createAsyncThunk и управлять состоянием сервера с помощью кэширования и оптимистичных обновлений RTK Query.

Часто задаваемые вопросы

Урок «Оптимистичные обновления и аннулирование кэша» бесплатный?

Да — полный текст урока «Оптимистичные обновления и аннулирование кэша» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Оптимистичные обновления и аннулирование кэша»?

Мгновенно обновляйте интерфейс при мутации и аннулируйте кэшированные данные с помощью тегов. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Оптимистичные обновления и аннулирование кэша»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Части Redux Toolkit и createSlice
  2. Асинхронная логика с createAsyncThunk
  3. RTK Query: конечные точки и автоматическое кэширование
  4. Оптимистичные обновления и аннулирование кэша
← Назад к React Academy