React Query 란?
리액트용 data-fetching 라이브러리로,
리액트 어플리케이션에서 서버의 상태를 fetching, caching, synchronizing, updating 한다.
react query는 다음과 같이 4가지 상태를 반환하는데, 반환 상태에 따라 렌더링을 다르게 처리하기 용이하단느 장점이 있다.
isIdle
: status === ‘idle’로, fresh/reset된 상태isLoading
: status === ‘loading’으로, mutation이 진행 중인 상태isError
: status === ‘error’로, mutation이 error를 발생시킨 상태isSuccess
: status === ‘success’로, mutation이 성공하여 data 이용이 가능한 상태
설치하기
1 | $ npm i react-query |
기본 예시
App.tsx
1 | import { QueryClient, QueryClientProvider, useQuery } from 'react-query' |
가장 상단
App.js
에서 최상단 컴포넌트로QueryClientProvider
을 전달한다.해당 Provider context의 props로
queryClient
객체를 전달한다.
Example.tsx
1 | function Example() { |
useQuery
에- query key 와
-
fetch
,axios
등을 이용한 CRUD 함수 를 전달한다.
useQuery
를 통해 isLoading
, error
, data
등을 받아 렌더링 한다.
1 | if (isLoading) return 'Loading...' |
isLoading
일 때는 로딩 렌더링error
일 때는 에러 렌더링- 이 외,
data
를 정상적으로 받아온 경우 컴포넌트를 알맞게 렌더링
useQuery
useQuery
가 반환하는 프로퍼티와 받는 매개변수는 다음과 같다.
1 | const { |
이를 사용한 예시는 다음과 같다.
먼저, useQuery에 전달할 getCategoryDetail
api 함수를 작성해보자.
1 | export const getCategoryList = async () => { |
이제 해당 함수를 useQuery에 전달하여 데이터를 받아보자.
1 | const { isLoading, error, data: categoryList } = useQuery('categoryList', getCategoryList); |
여기서 categoryList
는 query key 이며, getCategoryList
를 통해 받아온 데이터는 isLoading
, error
, data
등을 담은 객체에 저장된다.
여기서 data: categoryList
로 데이터 변수명을 설정하여 컴포넌트를 알맞게 렌더링하면 된다!
useMutation
useMutation
이 반환하는 프로퍼티와 받는 매개변수는 다음과 같다.
1 | const { |
이제 useMutation을 사용해보자!
1 | export const postItem = async (data: Item) => { |
위와 같이 정의한 postItem
api를 받아 mutation을 적용해보자.
1 | const mutation = useMutation((data: PutBodyProps) => postItem(data), { |
먼저 전달할 인자를 postItem
에 알맞게 전달하고, onSuccess
시 queryClient
를 통해 이전에 정의해놓은 query key 값을 전달하여 데이터를 mutate 시킨다.