react-query를 사용하여 데이터를 fetch할 때 router 객체를 가져오지 못하여 lazy query를 사용하였다.
const router = useRouter();
const { id } = router.query;
const {
data: diary,
isLoading,
isError,
error,
} = useQuery<Diary, Error>(
"diaryDetail",
() => getDiaryDetail(id as string),
{
enabled: !!id,
}
);
데이터를 수정하는 코드이다.
const { mutate: mutateRemove } = useMutation(removeDiary, {
onSuccess: () => {
router.push("/");
return queryClient.invalidateQueries(["diaryDetail", "allDiaries"]);
},
});
react-query는 쿼리 결과를 캐싱해뒀다가 같은 요청이 발생하면 쿼리를 다시 날리는 것이 아니라 저장해둔 캐시를 리턴한다. 데이터에 변동이 있을때는 캐시가 아닌 다시 요청을 보내 결과를 받아와야하는데 이것(refetching)을 가능하게 해주는 것이 invalidateQueries이다. 위 코드를 보면 diaryDetail을 등록해두었다. 이렇게 하면 mutation 이후에는 diaryDetail은 새로운 데이터를 가져와야 한다. 하지만 예상과 다르게 계속해서 캐시만 리턴하였다.
https://tanstack.com/query/latest/docs/react/guides/disabling-queries
Disabling/Pausing Queries | TanStack Query Docs
If you ever want to disable a query from automatically running, you can use the enabled = false option. When enabled is false:
tanstack.com
lazy query를 위해 enabled 옵션을 사용하는 이게 invalidateQueries를 무시한다고 한다.
const {
data: diary,
isLoading,
isError,
error,
} = useQuery<Diary, Error>(
"diaryDetail",
() => getDiaryDetail(id as string),
{
cacheTime: 0,
enabled: !!id,
}
);
캐시타임을 0으로 하여 해결하였다. 이렇게 할바에 여기서 react query를 사용하지 않는 것이 나아보이는데 조금 더 알아보고 수정해야겠다.
'개발 > web' 카테고리의 다른 글
| [Nextjs] middleware (0) | 2023.03.29 |
|---|---|
| [Nextjs] useEffect vs useLayoutEffect (0) | 2023.03.24 |
| [Nextjs] hydration (0) | 2023.03.24 |
| [ES] elasticsearch error (0) | 2022.08.20 |
| [React] sass-loader 설정 오류 해결법 (0) | 2020.05.22 |







