import { useQueryClient } from 'react-query';
export function usePrefetchTreatments(): void {
const queryClient = useQueryClient(); // queryClient를 반환
queryClient.prefetchQuery(queryKeys.treatments, getTreatments);
}
👉🏻 처음 home렌더링 시 treatments 데이터가 캐시에 등록된다.
export function useAppointments(): UseAppointments {
const currentMonthYear = getMonthYearDetails(dayjs());
const [monthYear, setMonthYear] = useState(currentMonthYear);
const [showAll, setShowAll] = useState(false);
// showAll이 true일 경우 selectedFn를 호출하지 않고 모든 데이터를 반환한다!
// 로그인한 사용자가 예약한 날짜를 표시하기 위함
const { user } = useUser();
// 이 함수는 useAppointments 훅이 실행될 때마다 변경 되기 때문에 useCallback을 실행해야 한다.
const selectedFn = useCallback(
(data) => {
// 변환한 다음 변환한 데이터를 반환한다!
// 가능한 예약을 모두 반환하는 암시적 반환을 사용한다.
return getAvailableAppointments(data, user);
},
[user], // 사용자가 로그아웃할 때마다 이 함수를 변경해야 한다.
);
// 👉🏻 getAppointments(year, month) : year, month 인수로 전달
// 👉🏻 AppoinmentDateMap을 반환하여 appointments에 할당
const fallback = {};
const { data: appointments = fallback } = useQuery(
[queryKeys.appointments, monthYear.year, monthYear.month],
() => {
getAppointments(monthYear.year, monthYear.month);
},
{ // 🚨 selectedFn의 인자에 자동으로 data가 들어간다!!
select: showAll ? undefined : selectedFn,
},
);
return { appointments, monthYear, updateMonthYear, showAll, setShowAll };
}
export function useStaff(): UseStaff {
const [filter, setFilter] = useState('all');
const selectedFn = useCallback(
(unfilteredStaff) => {
return filterByTreatment(unfilteredStaff, filter);
},
[filter],
);
const fallback = [];
const { data: staff = fallback } = useQuery(queryKeys.staff, getStaff, {
// 🚨 selectedFn의 인자에 자동으로 data가 들어간다!!
select: filter === 'all' ? undefined : selectedFn,
});
return { staff, filter, setFilter };
}
1️⃣ 옵션으로 제어하는 방법(전역일수도 있고 호출 쿼리 사용에 특정된 것)
2️⃣ 명령하여 useQuery를 쓰면 객체를 반환 하는데 그 중 refetch메서드가 있다.
const { data = fallback } = useQuery(queryKeys.treatments, getTreatments, {
staleTime: 600000, // 10 minutes
cacheTime: 900000, // 15 minutes
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
});
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
onError: queryErrorHandler,
staleTime: 600000, // 10 minutes
cacheTime: 900000, // 15 minutes
refetchOnReconnect: false,
refetchOnWindowFocus: false,
refetchOnMount: false,
},
},
});
// common optios for both useQuery and prefetchQuery
const commonOptions = {
staleTime: 0,
cacheTime: 300000, // 5 minutes
};
// prefetchQuery
useEffect(() => {
const nextMonthYear = getNewMonthYear(monthYear, 1);
queryClient.prefetchQuery(
[queryKeys.appointments, nextMonthYear.year, nextMonthYear.month],
() => {
getAppointments(nextMonthYear.year, nextMonthYear.month);
},
commonOptions, // staleTime과 cacheTime은 pre-fetching에 적용이 되어야하기 때문에 공통으로 분리해서 적용한다!
);
}, [monthYear, queryClient]);
// useQuery
const { data: appointments = fallback } = useQuery(
[queryKeys.appointments, monthYear.year, monthYear.month],
() => {
getAppointments(monthYear.year, monthYear.month);
},
{
// keepPreviousData: true, // 쿼리 키가 변경될 때까지 이전의 모든 데이터가 그대로 유지된다.
select: showAll ? undefined : selectedFn,
...commonOptions,
refetchOnMount: true,
refetchOnWindowFocus: true,
refetchOnReconnect: true,
},
);