React Hooksなしでの使用
Redux coreやRedux Toolkitと同様に、RTK Queryの主要機能はUIに依存せず、あらゆるUIレイヤーで使用できます。RTK Queryには、Reactでの使用に特化したcreateApi
のバージョンも含まれており、自動的にReact hooksを生成します。
React hooksは、ほとんどのユーザーがRTK Queryを使用する主な方法ですが、ライブラリ自体はプレーンなJSロジックを使用しており、React ClassコンポーネントでもReact自体に依存せずに使用できます。
このページでは、RTK Queryのキャッシュの挙動
を適切に活用するために、React Hooksを使用せずにRTK Queryとやり取りする方法について説明します。
サブスクリプションの追加
キャッシュのサブスクリプションは、RTK Queryにエンドポイントのデータをフェッチする必要があることを伝えるために使用されます。エンドポイントのサブスクリプションは、クエリエンドポイントにアタッチされたinitiate
thunkアクションクリエーターの結果をディスパッチすることで追加できます。
React hooksを使用する場合、この動作は代わりにuseQuery
、useQuerySubscription
、useLazyQuery
、およびuseLazyQuerySubscription
内で処理されます。
const promise = dispatch(api.endpoints.getPosts.initiate())
const { refetch } = promise
// interact with the cache in the same way as you would with a useFetch...() hook
const { data, isLoading, isSuccess /*...*/ } = await promise
サブスクリプションの削除
キャッシュのサブスクリプションを削除することは、キャッシュされたデータが不要になったことをRTK Queryが識別するために必要です。これにより、RTK Queryは古いキャッシュデータをクリーンアップして削除できます。
クエリエンドポイントのinitiate
thunkアクションクリエーターをディスパッチした結果は、unsubscribe
プロパティを持つPromiseです。このプロパティは、呼び出されると対応するキャッシュサブスクリプションを削除する関数です。
React hooksを使用する場合、この動作は代わりにuseQuery
、useQuerySubscription
、useLazyQuery
、およびuseLazyQuerySubscription
内で処理されます。
// Adding a cache subscription
const promise = dispatch(api.endpoints.getPosts.initiate())
// Removing the corresponding cache subscription
promise.unsubscribe()
キャッシュされたデータとリクエストステータスへのアクセス
キャッシュデータとリクエストステータス情報へのアクセスは、クエリエンドポイントのselect
関数プロパティを使用してセレクターを作成し、それをRedux stateで呼び出すことで実行できます。これにより、呼び出された時点でのキャッシュデータとリクエストステータス情報のスナップショットが提供されます。
endpoint.select(arg)
関数は新しいセレクターインスタンスを作成します。実際のセレクター関数自体ではありません!
React hooksを使用する場合、この動作は代わりにuseQuery
、useQueryState
、およびuseLazyQuery
内で処理されます。
const result = api.endpoints.getPosts.select()(state)
const { data, isSuccess, isError, error } = result
自動生成されたhooksとは異なり、isFetching
フラグはなく、すでにデータがある場合でも、ステータスが保留中の場合はisLoading
フラグがtrueになることに注意してください。
メモ化
endpoint.select(arg)
関数は呼び出されるたびに新しいセレクターを返し、このインスタンス自体がメモ化されているため、セレクターの作成をメモ化(たとえば、別のセレクターでそのメモ化されたインスタンスを使用するため)することが望ましい場合があります。これはcreateSelector
を使用して行うことができます
const createGetPostSelector = createSelector(
(id: string) => id,
(id) => api.endpoints.getPost.select(id),
)
const selectGetPostError = createSelector(
(state: RootState) => state,
(state: RootState, id: string) => createGetPostSelector(id),
(state, selectGetPost) => selectGetPost(state).error,
)
ミューテーションの実行
ミューテーションは、サーバー上のデータを更新するために使用されます。ミューテーションは、ミューテーションエンドポイントにアタッチされたinitiate
thunkアクションクリエーターの結果をディスパッチすることで実行できます。
React hooksを使用する場合、この動作は代わりにuseMutation
内で処理されます。
dispatch(api.endpoints.addPost.initiate({ name: 'foo' }))
例
React hooksを使用しない場合の例は、以下にあります。
React Class Components
の例のPostDetail
コンポーネントSvelte
の例- 以下の
キャッシュライフタイムサブスクリプションクラスコンポーネント
の例
詳細情報
- NgRxメンテナーのBrandon RobertsがCousins playing nicely: Experimenting with NgRx Store and RTK Queryという記事を書いています。これは、RTK QueryをNgRxに統合するためのいくつかのアプローチを示しています。
saulmoro/ngrx-rtk-query
は、RTKQ独自のReact hooksで管理されるサブスクリプションライフサイクルに相当するNgRxを実装しています。