React_tanStack Query
29 Aug 2023테킷 멋쟁이사자처럼 React
tanStack Query
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
//쿼리 클라이언트 객체 생성
const queryClient = new QueryClient({
defaultOptions: {
queries: {
// retry: 5, //기본값은 3
// staleTime : 1 * 1000 * 60 * 60 * 24 * 7;
// cacheTime:
},
},
}); //모든 쿼리에 사용되는 기본 옵션
{
/* 쿼리 클라이언트를 앱에 공급 */
}
<QueryClientProvider client={queryClient}>
<div className="App">
<Suspense fallback={<Spinner size={200} messeage="페이지 로딩 중..." />}>
<RouterProvider router={router} />
</Suspense>
</div>
{/* tanstack 쿼리 개발 도구 */}
<ReactQueryDevtools />
</QueryClientProvider>;
기본 옵션
const queryClient = new QueryClient({
defaultOptions: {
queries: {
// 요청 재시도 횟수
retry: 3,
// 캐시 시간 (기본 값: 5분)
cacheTime: 5 * 60 * 1000,
// 오래된 데이터(stale data) 식별 시간 (기본 값: 0)
// staleTime이 0인 경우, "데이터를 가져오는 순간 오래된 데이터로 간주"
staleTime: 3 * 1000,
// 브라우저 윈도우 초점 이동될 경우, 다시 가져오기
refetchOnWindowFocus: false,
// 네트워크 다시 연결될 경우, 다시 가져오기
refetchOnReconnect: false,
// 다시 마운트될 경우, 다시 가져오기
refetchOnMount: false,
},
},
});
데이터 가져오기, 로딩, 에러
async function fetchProducts() {
const response = await fetch(
`http://127.0.0.1:3000/api/collections/products/records`
);
return await response.json();
}
function TanStackQueryLibrary() {
const {isLoading, data, isError, error} = useQuery(
['products'], //React Query 내부적으로 사용되는 고유한 값
fetchProducts,
{
retry: 2,
})
if (isLoading) {
return (
<div className="grid place-content-center h-full">
<Spinner size={160} />
</div>
);
}
if (isError) {
return <div role="alert">{error.toString()}</div>;
}
return (
{
data?.items?.map((item) => {
return (
<li key={item.id}>
{item.title}
<img
src={
!item.photo
? 'https://placehold.co/191x291?text=PHOTO'
: `http://127.0.0.1:3000/api/files/${item.collectionId}/${item.id}/${item.photo}`
}
/>
<span>{(item.price)}</span>
</li>
);
})}
)
}