리액트

react-query

kny_0 2022. 6. 9. 01:00

설치

npm install react-query

 

index.js

import { QueryClient, QueryClientProvider } from "react-query"
const queryClient = new QueryClient()

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <QueryClientProvider client={queryClient}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </QueryClientProvider>
);

 

react-query 사용

import { useQuery } from "react-query"

function App(){
  const result = useQuery(name, ()=>
    axios.get('URL')
    .then((a)=>{ return a.data })
  )
}

 

ajax 상태 알아보기

import { useQuery } from "react-query"

function App(){
  let result = useQuery(name, ()=>
    axios.get('URL')
    .then((a)=>{ return a.data })
  )

  return (
    <div>
      { result.isLoading && '로딩중' }
      { result.error && '에러' }
      { result.data && result.data.name }
    </div>
  )
}

ajax 성공/실패/로딩중일 때 어떤 html <A/>를 화면에 보이게 하려면 state를 만들어 코드를 작성해야 했지만  react query를 쓰면 result에 ajax의 현재 상태가 자동으로 저장되어 그럴 필요가 없어진다.

 

ajax요청이 로딩중이면 result.isLoading 이 true가 된다.

ajax요청이 실패하면 result.error 가 true가 된다.

ajax요청이 성공하면 result.data 안에 데이터가 들어온다.

 

ajax 재요청

일정시간이 지난 후 자동으로 ajax 요청을 다시 해준다. 재요청을 끄거나 재요청 간격을 조절할 수도 있다.

 

ajax 재시도

인터넷 끊김으로 ajax 요청이 실패했을 경우 자동으로 요청을 재시도한다.

 

state 공유 필요 X

ajax로 가져온 결과는 props 전송이 필요 없다. ajax 요청이 2개나 있으면 1개만 전달하고 캐싱기능이 있어 이미 같은 ajax 요청을 한 적이 있으면 우선 가져와 사용한다.

 

사용 이유

ajax를 요청할 때

- 몇초마다 자동으로 데이터 다시 가져오게 하려면?

- 요청실패시 몇초 간격으로 재시도?

- 다음 페이지 미리가져오기?

- ajax 성공/실패시 각각 다른 html을 보여주려면?

 

react-query는 SNS, 코인거래소 같이 실시간 데이터를 보여줘야 하는 곳에 유용하다.

실시간으로 서버에서 데이터를 자주 보내려면 웹소켓이나 Server-sent event 같은 방식도 있다.