queryKey로 캐시에 저장되어 있는 것을 확인할 수 있다.
useQuery()는 쿼리 키로 캐시에 저장된 데이터가 있는지 확인 후 저장된 데이터가 없으면 쿼리 함수를 실행하여 데이터를 받아온 후 쿼리 키로 데이터를 캐시에 저장한다.
저장된 데이터가 있다면 그 데이터를 리턴한다.
Stale Time
Garbage Collection Time
라이프 사이클
특정 데이터만 따로 저장
function HomePage() {
const username = 'codeit'; // 임의로 username을 지정
const { data: postsDataByUsername } = useQuery({
queryKey: ['posts', username],
queryFn: () => getPostsByUsername(username),
});
console.log(postsDataByUsername);
return <div>홈페이지</div>;
}
function HomePage() {
const {
data: postsData,
isPending,
isError,
} = useQuery({
queryKey: ['posts'],
queryFn: getPosts,
retry: 0,
});
if (isPending) return '로딩 중입니다...';
if (isError) return '에러가 발생했습니다.';
const posts = postsData?.results ?? [];
return (
<div>
<ul>
{posts.map((post) => (
<li key={post.id}>
{post.user.name}: {post.content}
</li>
))}
</ul>
</div>
);
}
function HomePage() {
const {
data: postsData,
isPending,
isError,
} = useQuery({
queryKey: ['posts'],
queryFn: getPosts,
retry: 0,
});
useMutation()과 useQuery()의 차이점
useMutation() 훅을 이용해 새로운 데이터를 추가해도 캐시에 있는 데이터가 업데이트 되지 않기 때문에 자동으로 refetch 시켜주는 invalidateQueries()를 사용해줘야 한다.
import { useQueryClient } from '@tanstack/react-query'
const queryClient = useQueryClient();
// ...
queryClient.invalidateQueries();
const queryClient = useQueryClient();
// ...
const uploadPostMutation = useMutation({
mutationFn: (newPost) => uploadPost(newPost),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['posts'] });
},
});
useMutation() 함수의 콜백 옵션
mutate() 함수의 콜백 옵션
useMutation()에 등록된 콜백이 먼저 실행 그 후 mutate()에 등록한 콜백 함수 실행