React-Query: ボタンクリック時にデータフェッチングを行うサンプルコード
React-Query: ボタンクリック時に useQuery を使用する方法
ボタンクリック時に useQuery
を使用するには、以下の手順を実行します。
enabled オプションを false に設定
useQuery
の enabled
オプションを false
に設定することで、クエリが自動的に実行されるのを防ぎます。
const { data, isLoading, error, refetch } = useQuery("comments", fetchComments, { enabled: false });
ボタンクリック時に refetch を呼び出す
ボタンクリック時に refetch
関数を呼び出すことで、クエリを手動で実行できます。
<button onClick={refetch}>コメントをフェッチ</button>
データの表示とエラー処理
data
プロパティを使用してフェッチされたデータをレンダリングし、isLoading
プロパティを使用してデータフェッチングの進行状況を制御できます。
{isLoading && <p>コメントをフェッチしています...</p>}
{error && <p>エラーが発生しました: {error.message}</p>}
{data && data.map((comment) => (
<li key={comment.id}>{comment.text}</li>
))}
追加的なオプション
const { data, isLoading, error, refetch } = useQuery("comments", fetchComments, {
enabled: false,
staleTime: 10000, // 10秒間はデータを最新の状態に保つ
});
import React, { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
const fetchComments = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/comments');
const data = await response.json();
return data;
};
const App = () => {
const [comments, setComments] = useState([]);
const { isLoading, error, refetch } = useQuery('comments', fetchComments, {
enabled: false,
});
const handleClick = async () => {
const data = await refetch();
setComments(data);
};
return (
<div>
{isLoading && <p>コメントをフェッチしています...</p>}
{error && <p>エラーが発生しました: {error.message}</p>}
{comments.length > 0 && (
<ul>
{comments.map((comment) => (
<li key={comment.id}>{comment.text}</li>
))}
</ul>
)}
<button onClick={handleClick}>コメントをフェッチ</button>
</div>
);
};
export default App;
このコードでは、以下の処理が行われます。
fetchComments
関数は、API からコメントデータをフェッチします。App
コンポーネントは、useQuery
フックを使用してfetchComments
関数を呼び出し、コメントデータと読み込み状態、エラー情報を取得します。enabled
オプションをfalse
に設定することで、クエリは自動的に実行されず、ボタンクリック時にrefetch
関数を呼び出すまで待機します。handleClick
関数は、refetch
関数を呼び出してデータをフェッチし、setComments
を使用して取得したデータをcomments
ステートに格納します。- コメントデータが
comments
ステートに格納されると、コメントリストがレンダリングされます。 - "コメントをフェッチ" ボタンをクリックすると、
handleClick
関数が呼び出され、データがフェッチされて画面に表示されます。
useMutation を使用する方法
useMutation
フックは、非同期操作を実行し、その結果を処理するためのフックです。ボタンクリック時にデータをフェッチするには、以下の手順を実行します。
useMutation
フックを使用して、データフェッチング操作を定義します。- ボタンクリック時に
mutate
関数を呼び出して操作を実行します。 - 操作の結果を処理するために、
onSuccess
とonError
オプションを使用します。
import React, { useState } from 'react';
import { useMutation } from '@tanstack/react-query';
const fetchComments = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/comments');
const data = await response.json();
return data;
};
const App = () => {
const [comments, setComments] = useState([]);
const [mutate, { isLoading, error, data }] = useMutation(fetchComments, {
onSuccess: (data) => setComments(data),
});
const handleClick = () => {
mutate();
};
return (
<div>
{isLoading && <p>コメントをフェッチしています...</p>}
{error && <p>エラーが発生しました: {error.message}</p>}
{data && data.length > 0 && (
<ul>
{data.map((comment) => (
<li key={comment.id}>{comment.text}</li>
))}
</ul>
)}
<button onClick={handleClick}>コメントをフェッチ</button>
</div>
);
};
export default App;
useMemo と useEffect を使用する方法
useMemo
フックと useEffect
フックを組み合わせることで、ボタンクリック時にデータをフェッチすることもできます。
import React, { useState, useMemo, useEffect } from 'react';
const fetchComments = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/comments');
const data = await response.json();
return data;
};
const App = () => {
const [comments, setComments] = useState([]);
const memoizedComments = useMemo(() => fetchComments(), []);
useEffect(() => {
setComments(memoizedComments);
}, [memoizedComments]);
const handleClick = () => {
fetchComments().then((data) => setComments(data));
};
return (
<div>
{comments.length > 0 && (
<ul>
{comments.map((comment) => (
<li key={comment.id}>{comment.text}</li>
))}
</ul>
)}
<button onClick={handleClick}>コメントをフェッチ</button>
</div>
);
};
export default App;
カスタムフックを使用する方法
ボタンクリック時にデータフェッチングを行うためのカスタムフックを作成することもできます。
import React, { useState, useEffect } from 'react';
const useFetchComments = () => {
const [comments, setComments] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const fetchComments = async () => {
setIsLoading(true);
try {
const response = await fetch('https://jsonplaceholder.typicode.com/comments');
const data = await response.json();
setComments(data);
} catch (err) {
setError(err);
} finally {
setIsLoading(false);
}
};
useEffect(() => {
fetchComments();
}, []);
return {
comments,
isLoading,
error,
fetchComments,
};
};
const App = () => {
const { comments, isLoading, error, fetchComments } = useFetchComments();
const handleClick = () => {
fetchComments();
};
return (
<div>
{isLoading && <p>コメントをフェッチしています...</p>}
{error && <p>エラーが発生しました: {error.message}</p>}
{comments.length > 0
reactjs react-native react-query