TanStack query を使うと、データの取得や、更新時のキャッシュ、古いデータ周りのことを簡単に扱うことができます。この記事では、create-react-app でアプリ作成後 TanStack query でページネーション機能を用いたデータの読み込みを行います。
アプリ作成とパッケージをインストール
react アプリを作成します。
create-react-app アプリ名
TanStack query パッケージをインストールします。
npm install @tanstack/react-query
ファイル構成
src//
|-- api//
| `-- comments.js
|-- App.js
`-- index.js
TanStack query を使う
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient()
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
);
11, 13: QueryClientProvider で App コンポーネントを囲います。
サーバーからデータを取得
例では、サーバーからページ数と同じ id のコメントが返されると仮定しています。
let Comments = [
{ id: 1, comment: "Comment 1" },
{ id: 2, comment: "Comment 2" },
{ id: 3, comment: "Comment 3" },
{ id: 4, comment: "Comment 4" },
{ id: 5, comment: "Comment 5" },
]
export const getComment = (page) => {
return delay().then(() => {
return [Comments.find((r) => r.id === page)]
}).catch((error) => {
return Promise.reject({ error })
})
}
async function delay(ms = 500) {
return new Promise(resolve => setTimeout(resolve, ms))
// return new Promise((resolve, reject) => setTimeout(() => reject("error message"), ms));
}
ページネーション機能
TanStack Query では、 queryKey
にページ情報を含めることで、ページネーションを機能させます。
import { useQuery } from '@tanstack/react-query'
import { useState } from 'react';
import { getComment } from './api/comments';
function App() {
const [page, setPage] = useState(1);
const query = useQuery({
queryKey: ["comments", { page }],
queryFn: () => getComment(page),
keepPreviousData: true,
})
if (query.isLoading) return <h1>Loading...</h1>
if (query.isError) return <h1>{JSON.stringify(query.error)}</h1>
return (
<div className="App">
{query.data.map(res => (
<div key={res.id}>{res.id} {res.comment}</div>
))}
{query.isFetching ? ('isLoading...') : <></>}
<button onClick={() => setPage(page - 1)}>prev</button>
<button onClick={() => setPage(page + 1)}>next</button>
</div>
);
}
export default App;
8: queryKey にページ情報を渡します。page は、react hooks の 6: useState
で管理しています。
9: サーバー側でページ情報を使うので、page を引数に渡します。
10: keepPreviousData: true
クエリキーが変更され、新しいデータが要求(Fetching)されている間にも、前のデータが利用可能になり、新しいデータが到着すると、以前のデータがシームレスにスワップされて新しいデータが表示されます。
22: 新しいデータが要求(Fetching)中に、isLoading… を表示させています。
以上ページネーション機能を実装しました。
React TanStack query を使ったデータの読み込みと更新
2023年02月18日
React