
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 600000, // 10분
gcTime: 900000, // 15분
refetchOnWindowFocus: false,
},
},
queryCache: new QueryCache({
onError: (error) => {
const title = createTitle(error.message, "query");
errorHandler(title);
},
}),
mutationCache: new MutationCache({
onError: (error) => {
const title = createTitle(error.message, "mutation");
errorHandler(title);
},
}),
});
useQuery와 유사isLoading vs isFetchingonMutate callbackexport function useReserveAppointment() {
const { userId } = useLoginData();
const toast = useCustomToast();
const { mutate } = useMutation({
// mutationFn에 인자를 설정하면 mutate 함수의 인자가 된다.
// ex) () => mutate(appointmentData)
mutationFn: (appointment: Appointment) =>
setAppointmentUser(appointment, userId),
onSuccess: () => {
toast({ title: "You have reserved an appointment!", status: "success" });
},
});
return mutate;
}
mutate->onSuccess->invalidateQueries-> active query ->refetch>invalidateQueries로 관련 쿼리들를 무효화시키면 재요청을 유발하게되어 새로고침 없이 데이터가 업데이트 된다.
Query Filters는 한 번에 여러 쿼리에 영향을 줄 수 있는 queryClient 메소드에 적용된다.
removeQueries, invalidateQueries, cancelQueries, etc...query filter 인자를 받는다.active, inactive or allisFetching statususePatchUser 커스텀 훅useUser의 updateUser를 사용queryClient 메소드인 setQueryData를 사용하여 쿼리 캐시 업데이트낙관적 업데이트는 서버로부터 응답을 받기도 전에 UI에 표시되는 데이터를 업데이트하는 것
리액트 쿼리에는 UI뿐만 아니라 실제 쿼리 캐시도 업데이트하는 옵션을 제공한다.
데이터가 많은 다른 컴포넌트에서 표시되는 경우 이 모든 작업을 수행하는 것이 가치가 있을 수 있다.
export function usePatchUser() {
const { user } = useUser();
const queryClient = useQueryClient();
const { mutate: patchUser } = useMutation({
mutationKey: [MUTATION_KEY],
mutationFn: (newData: User) => patchUserOnServer(newData, user),
onSuccess: () => {
toast({ title: "user updated!", status: "success" });
},
// onSettled = onSuccess + onError
// mutation이 끝나면 성공이든 오류든 상관없이 실행된다.
onSettled: () => {
// invalidateQueries가 완료되고 서버에서 새로운 데이터를 받을 때까지
// mutation이 진행 중인 상태를 유지하기 위해 Promise를 반환해야 함 (return 명시!)
return queryClient.invalidateQueries({
queryKey: [queryKeys.user],
});
},
});
return patchUser;
}
useMutationState 훅을 사용하여 서버에 mutation을 요청하는 데이터 즉, mutation 데이터를 얻을 수 있다....
const pendingData = useMutationState({
filters: { mutationKey: [MUTATION_KEY], status: "pending" },
select: (mutation) => {
return mutation.state.variables as User;
},
});
// 보류 중인 데이터
const pendingUser = pendingData ? pendingData[0] : null;
...
<Stack textAlign="center">
<Heading>
Information for {pendingUser ? pendingUser.name : user?.name}
</Heading>
</Stack>
...