- 2021年1月22日
データ取得ライブラリ「React Query」のススメ
はじめに
こんにちは、さわだです。
IB-Mes クラウドではデータの取得をReact Queryを採用しました。
このライブラリを利用すると、リトライやキャッシュ、ローディングの表示などが簡単になります。
今回は、簡単に機能や使い方をご紹介します。
機能
- キャッシュ
- ポーリング(一定周期ごとにデータの再取得)
- ページネーション
- リトライ
- 並列実行
- Typescriptサポート
インストール方法
npm i react-query
基本的な使い方
React QueryはフックAPIを通して利用します。
useQuery関数には、キャッシュのキー、データの取得方法を設定します。
実行すると、data: 取得したデータ、isLoading: ローディング中かどうかが取得できます。
import { useQuery } from 'react-query' export default function Qiita() { const { data, isLoading } = useQuery('qiita', () => fetch('https://qiita.com/api/v2/items?query=react%3Aquery') .then(x => x.json())) return ( <> <h1>記事</h1> {!isLoading ? (<ul> {data.map(x => <li key={x.title}>{x.title}</li>)} </ul>) : 'Loading...'} </> ) }
上記を実行すると以下のように表示されます。
ポーリング
一定周期でデータの問い合わせを行いたい場合も、オプションを設定するだけです。
Next.jsのAPIルートを使って、ランダムな数値を返すAPIを用意しました。
export default (req, res) => { res.statusCode = 200 res.json({ value: Math.random() }) }
UI側は以下のようなコードとなります。
import { useQuery } from 'react-query' export default function Random() { const { data, isLoading } = useQuery('random', () => fetch('http://localhost:3000/api/hello').then(x => x.json()), { refetchInterval: 500, staleTime: 0 }) return ( <> <h1>Random</h1> {!isLoading ? (<>Value: {data.value}</>) : 'Loading...'} </> ) }
デバッグ時について
その他にも、ウィンドウにフォーカス時にデータの再取得を行ってくれたり、便利な機能があります。
開発時には不要だよという方は無効にしておくとよいと思います。
const { data, isLoading } = useQuery('qiita', () => fetch('https://qiita.com/api/v2/items?query=react%3Aquery').then(x => x.json()), { refetchOnWindowFocus: false })
さいごに
公式ドキュメント見ると、SWRなどの比較もあるので参考にしてみてください。
https://react-query.tanstack.com/docs/comparison
また、今回書いたコードは以下にあげておきました。
https://github.com/msp0310/react-query-example
参考
- React-Query
https://react-query.tanstack.com/ - React-Query(Github)
https://github.com/tannerlinsley/react-query