Tanstack Query (ex. React Query)
原典
https://tanstack.com/query/latest/docs/react/overview
概要
- Server state(バックエンドのデータ)を fetching, caching, synchronizing and updating するためのライブラリ
- Server state は、ローカルの同期的なデータとは根本的に性質が異なる。にもかかわらず、redux のようなものでそれを管理してきたけど、辛いよね。私に頼りなさい。
インストール
yarn add react-query
// App.tsx
import { QueryClient, QueryClientProvider } from 'react-query';
import { ReactQueryDevtools } from 'react-query/devtools';
const queryClient = new QueryClient();
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<ReactQueryDevtools />
<MyApp />
</QueryClientProvider>
);
}
使い方
// MyComponent.tsx
import { useQuery } from 'react-query';
function MyComponent() {
const { isLoading, error, data } = useQuery('repoData', () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(
(res) => res.json(),
),
);
if (isLoading) return 'Loading...';
if (error) return 'An error has occurred: ' + error.message;
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
<strong>👀 {data.subscribers_count}</strong>{' '}
<strong>✨ {data.stargazers_count}</strong>{' '}
<strong>🍴 {data.forks_count}</strong>
</div>
);
}
デフォルト設定に関する注意
デフォルト設定を知っておかないと罠にはまるのでここはきちんと抑えておくこと。
- キャッシュデータは stale として扱われる(
staleTime
)。このため、下記の場合にデータが自動的に再取得される。- クエリを使用する新しいコンポーネントがマウントされた時(
refetchOnMount
) - ウィンドウが再フォーカスされた時(
refetchOnWindowFocus
) - ネットワークが再接続された時(
refetchOnReconnect
) - 再取得の間隔が明示的にセットされている時(
refetchInterval
)
- クエリを使用する新しいコンポーネントがマウントされた時(
- どのコンポーネントにも使用されていないキャッシュデータは
inactive
としてしばらく残るが、5 分後に削除される(cacheTime
)。 - 失敗したクエリは自動的に3回再試行される。間隔は指数関数的に伸びる。(
retry
,retryDelay
) - クエリ結果はStructural Sharingという仕組みで保持されている。これにより、本当に値が変わった時にだけ最小限のオブジェクトの参照が変更される。これは、ほとんどの場合で効率的である。
Query
- クエリするには下記の2つが必要
- ユニークなキー
- Promise(データを resolve するか、エラーを投げる)
const result = useQuery('todos', fetchTodoList);
// or
const result = useQuery({
queryKey: 'todos',
queryFn: fetchTodoList,
});