📌

[TanStack Query]QueryClientは設定に気をつける

に公開

言わずと知れたTanStack Query(旧称 React Query)は、 データ取得 + キャッシュ管理をしてくれるライブラリ です。
Reactだけでなく、Vue、Svelteなどもサポートしています。

今回は、ちょっとしたUI操作だけで何度もAPIリクエストが発生する状態になってしまった時の解決備忘録です。

原因はこれ

結論、原因はQueryClientを初期化しているコードでした。

 const [queryClient] = useState(() => new QueryClient()); 

QueryClient

TanStack Queryの全体の管理者
全クエリのキャッシュ管理や、全体のデフォルト動作設定、refetchのグローバルルールも設定できます。

ちなみに、単独クエリ向けの個別設定はuseQuery で行います。

https://tanstack.com/query/v5/docs/reference/QueryClient#queryclientprefetchquery

APIリクエストが過度になっているため、フェッチのタイミングの設定が必要なようです。

staleTime(データを取得してから何ミリ秒間、再フェッチしないでいいか)の設定か、QueryClientのオプションで解決できます。

今回は、特に詳細な時間やタイミングを決めたいわけではないので、ひとまずオプションで対応することにしました。

refecthタイミングを制御するオプション

この3つはqueryClientのrefecthタイミングを制御するオプションです。

- refetchOnMount
    マウント時にrefetchするかどうか
- refetchOnWindowFocus
    ウィンドウをfocusした際にrefetchするかどうか
- refetchOnReconnect
    再接続時にrefetchするかどうか

これらの返り値はbooleanalwaysです。

refetchOnMount: boolean | "always" | ((query: Query) => boolean | "always")

false 該当のタイミングではrefetchしない
true キャッシュが古い場合refetchする
alwaysキャッシュの状態に関わらず毎回refetchする

そして、今回私が盲点だったのが、全てデフォルトはtrue なことです。

解決

過度な再フェッチを避けるために、refetchに関わるこれらのオプションは 一旦false にします。

必要があれば useQueryを使ってオプションやstale Timeを個別設定するといいのかなと思います。

参考

https://tanstack.com/query/v5/docs/framework/react/guides/important-defaults

🎄こちらは2025年 福岡 Tech Women Communityのアドベントカレンダー参加記事です。
https://qiita.com/advent-calendar/2025/fukuoka_tech_women

Discussion