- 로딩 및 에러 처리
- 페이지네이션 / 무한 스크롤
- 데이터 요청
- 데이터 사전 요청(Prefetching)
- 데이터 수정 및 업데이트(Mutations)
- 중복 요청 제거
- 기존의 쿼리가 출력되는 동안 다른 컴포넌트에서 중복 요청이 일어나면 중복 요청을 제거한다.
- 서버 요청 에러 재시도(Retry)
쿼리들과 캐시를 관리하는 클라이언트
자식 컴포넌트들의 캐시와 클라이언트의 기본 설정값을 제공
query client에 값으로 적용
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient();
function App() {
return (
// provide React Query client to App
<QueryClientProvider client={queryClient}>
<div className="App">
<h1>Blog Posts</h1>
<Posts />
</div>
</QueryClientProvider>
);
}
useQuery를 기본적으로 데이터 패칭에 사용
import { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { PostDetail } from "./PostDetail";
//데이터를 요청해 캐싱할 값을 반환하는 함수
async function fetchPosts() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/posts?_limit=10&_page=0"
);
return response.json();
}
export function Posts() {
//인자 1: 쿼리 키 배열, 2: 비동기 데이터 요청 함수
const { data, isLoading } = useQuery(["posts"], fetchPosts);
if (isLoading) {
return (
<div>로딩 중</div>
)
}
if (isError) {
return <div>에러가 발생했습니다.</div>;
}
return (
<>
<ul>
{data.map((post) => (
<li
key={post.id}
className="post-title"
>
{post.title}
</li>
))}
</ul>
</>
);
}
여기서 중요한 점!
data
를 undefined로 반환한다.참고 사항
isFetching
과 isLoading
과의 차이점Retry 속성
error
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: true,
},
},
})
그건 사용자가 윈도우 창을 집중해 사용할 때, 다시 데이터를 요청하는 옵션이 디폴트로 true로 설정된 상태이기 때문이다.