npm i react-query
<QueryClientProvider>
로 감싸준다^^import {
useQuery,
useMutation,
useQueryClient,
QueryClient,
QueryClientProvider,
} from "react-query";
// Create a client
const queryClient = new QueryClient();
ReactDOM.render(
<React.StrictMode>
{/* // Provide the client to your App */}
<QueryClientProvider client={queryClient}>
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>
</QueryClientProvider>
</React.StrictMode>,
document.getElementById("root")
);
const [coins, setCoins] = useState<CoinInterface[]>([]); //타입: CoinInterface의 타입들이 들어간 배열
const [loading, setLoading] = useState(true);
useEffect(() => {
// ()(); 즉시 실행 함수
(async () => {
const response = await fetch("https://api.coinpaprika.com/v1/coins");
const json = await response.json();
setCoins(json.slice(0, 100));
setLoading(false);
})();
}, []);
export function fetchCoins() {
return fetch("https://api.coinpaprika.com/v1/coins").then((response) =>
response.json()
);
}
import { useQuery } from "react-query";
...
// useQuery는 isloading이라는 state를 반환 (불리언타입)
// fetcher 함수로 가져온 데이터는 data에 저장
const {isLoading, data} = useQuery<CoinInterface[]>("allCoins",fetchCoins)
💞useQuery(캐시 이름, fetch 함수,[refetch 설정])
useQuery
는 데이터를 캐시로 저장하는데 이를 개발자 도구를 통해 시각적으로 확인할 수 있다.import { ReactQueryDevtools } from 'react-query/devtools'
App.tsx
function App() {
return (
<>
<GlobalStyle />
<Router />
//개발자 도구 컴포넌트 추가
<ReactQueryDevtools initialIsOpen={true} />
</>
);
}
useQuery
를 이용해 받아온 데이터"allCoins"
가 캐시로 저장되어 있다는 것을 알 수 있음 useQuery
의 3번째 인자에 refetchInterval:밀리초
를 설정합니다. const { isLoading, data } = useQuery<PriceData>(
["tickers", coinId], fetchFunction ,
{
refetchInterval: 5000,
//5초마다 refetch
}
);
리액트 쿼리 공식 문서 https://react-query.tanstack.com/devtools
React JS 마스터클래스 - 노마드코더 https://nomadcoders.co/react-masterclass