리액트 애플리케이션에서 서버의 state 가져오기, 캐싱, 동기화, 업데이트를 쉽게 구현할 수 있게 도와주는 리액트 라이브러리이다.
리액트에서 state를 관리하는 라이브러리들은 비동기 작업에 친화적이지 않다. 이는 클라이언트의 state와 서버의 state 형태가 다르기 때문이다.
React Query를 설치한다.
npm install react-query
(index.jsx)
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
// react-query
import { QueryClient, QueryClientProvider } from 'react-query';
// Create a client
const client = new QueryClient();
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
// client 제공
<QueryClientProvider client={client}>
<App />
</QueryClientProvider>
);
App.jsx에 바로 적용해도 된다.
(App.jsx)
// react-query
import { QueryClient, QueryClientProvider } from 'react-query';
// client 생성
const queryClient = new QueryClient()
function App() {
return (
// client 제공
<QueryClientProvider client={queryClient}>
<Component />
</QueryClientProvider>
)
}
(App.tsx)
import { useQuery } from 'react-query';
const App = () => {
const { ... } = useQuery(
queryKey,
queryFunction,
options
);
return (
...
);
}
(📎 useQuery 자세한 정보)
import { useQuery } from 'react-query';
const App = () => {
// Promise 반환하는 비동기 함수
const getProducts = async (): Promise =>
await (await fetch('https://fakestoreapi.com/products')).json();
const { data, isLoading, error } = useQuery(
'products',
getProducts
);
// 로딩중이라면
if (isLoading) return <LinearProgress />
// 에러라면
if (error) return <div>Somthing went wrong...</div>
return (
...
// 가져온 데이터 매핑
{data?.map(item => (
<Item item={item} />
))}
);
}