useQuery | TanStack Query Docs
// 사용법(1)
const { data, isLoading, ... } = useQuery(queryKey, queryFn, {
// ...options ex) enabled, staleTime, ...
});
// 사용법(2)
const result = useQuery({
queryKey,
queryFn,
// ...options ex) enabled, staleTime, ...
});
result.data
result.isLoading
// ...
// 실제 예제
const getAllSuperHero = async () => {
return await axios.get("<http://localhost:4000/superheroes>");
};
const { data, isLoading } = useQuery(["super-heroes"], getAllSuperHero);
queryKey(필수)
, 두 번째 인자가 queryFn(필수)
, 세 번째 인자가 options(optional)
이다.queryKey
의 경우 무조건 배열로 지정해야 한다.// (1)
const getSuperHero = async ({ queryKey }: any) => {
const heroId = queryKey[1]; // queryKey: ['super-hero', '3']
return await axios.get(`http://localhost:4000/superheroes/${heroId}`);
};
const useSuperHeroData = (heroId: string) => {
// 해당 쿼리는 heroId에 의존
return useQuery(["super-hero", heroId], getSuperHero);
};
useQuery는 첫 번째 인자인 queryKey
를 기반으로 데이터 캐싱
을 관리한다.
의존
한다면 배열에 이어서 넣어주면 된다.
ex: ["super-hero", heroId, ...]
["super-hero", heroId]
이다. 그렇다면 queryClient.setQueryData를 이용할 때 똑같이 ["super-hero", heroId]
포맷을 가져야 한다. 안그러면 제대로 원하는 쿼리 접근이 안된다.// 예
const useSuperHeroData = (heroId: string) => {
return useQuery(["super-hero", heroId], () => getSuperHero(heroId), {
cacheTime: 5 * 60 * 1000, // 5분
staleTime: 1 * 60 * 1000, // 1분
retry: 1,
// ...options
});
};
// (2)
const getSuperHero = async (heroId: string) => {
return await axios.get(`http://localhost:4000/superheroes/${heroId}`);
};
const useSuperHeroData = (heroId: string) => {
return useQuery(["super-hero", heroId], () => getSuperHero(heroId));
};
useQuery의 두 번째 인자인 queryFn는 Promise
를 반환하는 함수를 넣어야한다.
참고로, queryKey의 예제와 queryFn 예제가 약간 차이점
이 있다.
몇 가지 상황을 제외하면 쿼리 여러 개가 선언된 일반적인 상황일 때, 쿼리 함수들은 그냥 병렬로 요청돼서 처리
된다.
이러한 특징은 쿼리 처리의 동시성
을 극대화 시킨다.
options
의 경우 공식 문서에서 더 자세히 확인을 할 수 있으며, 주요 옵션들만 정리해 두었다.