
문제
질문을 닫으면 우측의 태그가 답변 완료로 업데이트가 되는 것을 기대하고 invalidateQueries를 사용했으나 업데이트가 되지 않았다. 한번 새로고침을 해야 업데이트가 되었다.
const queryClient = useQueryClient();
const id = useParams().id;
const mutationFn = async () => {
try {
await axios.post("/closequestion", { id });
} catch (error) {
console.error(`Error occurred`);
}
};
const { mutate } = useMutation({
mutationFn,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["questionList"],
});
},
});
기존 코드
원인
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 9000000,
cacheTime: 12000000,
refetchOnWindowFocus: false,
refetchOnMount: false,
},
},
});
QueryClient 인스턴스를 만들 때 디폴트옵션에 refetchOnMount를 false로 지정하면 이런 일이 발생한다.
이 설정을 하면 언마운트 된 컴포넌트의 쿼리는(=inactive 한 쿼리는) 리페칭을 하지 않는다.
하지만 이 설정을 유지하면서 inactive한 쿼리를 업데이트 하는 방법도 제공중이다.
해결
const queryClient = useQueryClient();
const id = useParams().id;
const mutationFn = async () => {
try {
await axios.post("/closequestion", { id });
} catch (error) {
console.error(`Error occurred`);
}
};
const { mutate } = useMutation({
mutationFn,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["questionList"],
refetchType: "all", // ✨추가!!
});
},
});
refetchType: "all" 을 준다.
refetchType?: 'active' | 'inactive' | 'all' | 'none'
refetchType 은 네가지 속성이 있는데 지정하지 않아도 기본값은 active로 설정되어 있다. all을 주면 모든 경우에 리페칭을 할 수 있다.
리액트 쿼리에서는 refetchActive, refetchInactive 라는 두가지 속성으로 제공 중인데 탠스택 쿼리로 넘어오면서 합쳐졌다.

버튼을 누르는 즉시 업데이트가 되어 다시 돌아가면 바로 색이 바뀐 태그를 볼 수 있다.
'문제 기록' 카테고리의 다른 글
| [framer-motion] 줄 당기는 효과 만들기 (0) | 2023.06.24 |
|---|---|
| [react] 상태 업데이트 후 바로 변경된 UI를 조작하기 (0) | 2023.04.26 |
| ''ts-node'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. 해결방법 (0) | 2023.02.13 |
| [git] 변경 사항 다른 브랜치에 커밋하기 (0) | 2022.11.19 |
| Express + React 프로젝트 배포 시 404 not found 오류 (0) | 2022.09.29 |
댓글