
select option을 이용한 filter가 유용한 이유
리액트 쿼리는 실제로 이를 최적화하기 때문(불필요한 계산을 줄임)
상세 동작
이는 select 함수를 위한 안정적인 함수가 필요하다는 의미
이때, 익명 함수에서 안정적인 함수를 만들고 싶다면
useCallback함수 사용
refetchInterval이 경과한 경우refetchOnMount, refetchOnWindowFocus, refetchOnReconnect, refetchIntaval
명령형으로 refetch (in useQuery)
refetchOnMount, refetchOnWindowFocus, refetchOnReconnect 중 하나 또는 모두 끄기리페치 억제는 자주 변경되지 않고 약간 오래되어도 사용자에게 큰 영향을 미치지 않는 데이터에 대해서만 수행해야함.
네트워크 호출을 효과적으로 줄이는가? 스스로 판단하기
전역에서 리페치 옵션을 관리한다. 필요에 따라 개인화된 옵션을 추가로 설정할 수 있다.
src/react-query/queryClient.tsuseQuery의 refetchInterval 옵션을 사용하여 폴링 간격 설정
const { data: appointments = fallback } = useQuery({
queryKey: [queryKeys.appointments, monthYear.year, monthYear.month],
queryFn: () => getAppointments(monthYear.year, monthYear.month),
select: (data) => selectFn(data, showAll),
refetchOnWindowFocus: true,
refetchInterval: 60000, // 1분 간격으로 데이터 리페칭
...commonOptions,
});
useCallback을 사용const selectFn = useCallback(
(unfilteredStaff: Staff[]) => {
if (filter === "all") return unfilteredStaff;
return filterByTreatment(unfilteredStaff, filter);
},
[filter]
);// 전역 queryClient에 옵션 설정
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 600000, // 10분
gcTime: 900000, // 15분
refetchOnWindowFocus: false,
},
},
...
});
// 특정 useQueries 및 prefetch 쿼리 호출에서 Overloading
const commonOptions = {
staleTime: 0,
gcTime: 30000, // 5분(기본값)
};
...
const { data: appointments = fallback } = useQuery({
queryKey: [queryKeys.appointments, monthYear.year, monthYear.month],
queryFn: () => getAppointments(monthYear.year, monthYear.month),
select: (data) => selectFn(data, showAll),
refetchOnWindowFocus: true,
refetchInterval: 60000, // 1분
...commonOptions,
});
...
refetchInterval 옵션
서버에서 데이터가 변경되었을 경우를 대비해 일정 간격으로 데이터를 리페치