0Pricing
React Academy · レッスン

Optimistic Updatesとキャッシュ無効化

mutation時にUIを即座に更新し、tagsでキャッシュされたデータを無効化します。

「Optimistic Updatesとキャッシュ無効化」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

はじめに

このレッスンでは、RTK Queryでミューテーションエンドポイントを構築し、楽観的更新でUIをすぐに更新し、タグを使って古くなったキャッシュエントリを無効化します。

ミューテーションエンドポイント

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'],
  }),
})

きめ細かなタグの無効化

きめ細かく無効化するには、idを持つタグオブジェクトを使用します。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']));

悲観的更新と楽観的更新

楽観的更新:サーバーのレスポンス前にキャッシュを更新します(UIはすぐに更新され、エラー時に元に戻します)。悲観的更新:サーバーを待ってから更新します(より安全ですが、遅くなります)。ミューテーションが失敗するリスクに応じて選択します。

タグと手動再フェッチの使い分け

無効化するクエリーを正確に把握している場合はタグを使用します。1回限りの手動更新には、クエリーフックのrefetch()を使用します。大規模なAPIでは、タグのほうが自動化しやすく、拡張性にも優れています。

理解度チェック

RTK Queryで、ミューテーションエンドポイントのinvalidatesTagsは何を行いますか?

まとめ

builder.mutationでミューテーションを定義します。クエリーではprovidesTagsを、ミューテーションではinvalidatesTagsを使用して自動再フェッチを行います。楽観的更新にはonQueryStartedとupdateQueryDataを使用し、ロールバックにはundo()を使用します。

コース修了

おめでとうございます!**Redux Toolkit & RTK Query**を修了しました。これでReduxスライスを構築し、createAsyncThunkで非同期ロジックを処理し、RTK Queryのキャッシュと楽観的更新でサーバー状態を管理できるようになりました。

よくある質問

「Optimistic Updatesとキャッシュ無効化」レッスンは無料ですか?

はい。「Optimistic Updatesとキャッシュ無効化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Optimistic Updatesとキャッシュ無効化」で何を学びますか?

mutation時にUIを即座に更新し、tagsでキャッシュされたデータを無効化します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Optimistic Updatesとキャッシュ無効化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Redux ToolkitのSlicesとcreateSlice
  2. createAsyncThunkによる非同期ロジック
  3. RTK Query:Endpointsと自動キャッシュ
  4. Optimistic Updatesとキャッシュ無効化
← React Academyに戻る