React Query의 모든 내부 작동을 시각화하는 데 도움이 되며 문제가 발생하면 디버깅 시간을 절약할 수 있다.
( = 캐시에 있는 query 를 직접 볼 수 있다.)
process.env.NODE_ENV === 'development'인 경우에만 번들에 포함되므로
프로덕션 빌드 중에 제외하는 것에 대해 걱정할 필요가 없다.
npm i -D @tanstack/react-query-devtools
import { ReactQueryDevtools } from 'react-query/devtools';
<ReactQueryDevtools initialIsOpen={true} />
false
or true
로 보이게 설정할 수 있다.fetchCoinInfo
,fetchCoinTickers
2개의 fetcher 함수 만들기.- api.ts
const BASE_URL = `https://api.coinpaprika.com/v1`;
export function fetchCoins() {
return fetch(`${BASE_URL}/coins`).then(response => response.json());
}
export function fetchCoinInfo(coinId: string) {
// → coinId 가 정의되지 않았으므로, argument 로 coinId 을 넘겨준다.
return fetch(`${BASE_URL}/coins/${coinId}`).then(response => response.json());
}
export function fetchCoinTickers(coinId: string) {
return fetch(`${BASE_URL}/tickers/${coinId}`).then(response =>
response.json()
);
}
.then()
을 통해 json 파일을 추출해줌.Coin()
에 적용해준다.- Coin.tsx
function Coin() {
const { coinId } = useParams() as unknown as RouteParams;
const { state } = useLocation() as RouteState;
const priceMatch = useMatch("/:coinId/price");
const chartMatch = useMatch("/:coinId/chart");
const { isLoading: infoLoading, data: infoData } = useQuery<InfoData>(
["info", "coinId"],
() => fetchCoinInfo(coinId)
// → fetcher 함수에게 url로부터 오는 coinId 를 넘겨줘야하므로 익명함수 처리
);
const { isLoading: tickersLoading, data: tickersData } = useQuery<PriceData>(
["tickers", "coinId"],
() => fetchCoinTickers(coinId),
{
refetchInterval: 5000,
// → 5초마다 state 실시간 업데이트
}
);
const loading = infoLoading || tickersLoading;
["info", "coinId"],
, ["tickers", "coinId"],
isLoading
,data
가 2개가 될 순 없으므로const { isLoading: infoLoading, data: infoData }
,{ isLoading: tickersLoading, data: tickersData }
isLoading
을 가지고 있으므로 한번에 모아서 처리해주기 위해 변수를 선언했다.const loading = infoLoading || tickersLoading;
interface
도 설정해주었다.