티스토리 뷰

Library | Framework/React JS

[React] React-Query

공부하는 승승 2022. 11. 10. 01:25

React-Query

- ajax 성공시/실패시 HTML을 보여주려면?

- 몇 초마다 자동으로 AJAX 요청을 하려면?

- 실패시 몇 초 후에 재요청을 하려면?

- 다음 페이지 내용을 미리 가져오려면(=prefetch)?

 

...등등을 간단하게 도와줌

 


* React-Query를 사용하기에 유용한 곳

실시간 데이터를 계속 가져와야하는 사이트

 

0. React-Query 설치

  • 터미널 창에서
      npm install react-query  

 

1. React-Query 세팅

- index.js

  • QueryClient
  • QueryClientProvider
import { QueryClient, QueryClientProvider } from 'react-query';

const queryClient = new QueryClient()

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

 

 

2. React-Query 사용하기

📘 페이지 우측 상단에 사용자 이름 불러오기 ex) 반가워요 ㅇㅇ님!

...
import { useQuery } from 'react-query';

function App() {
   ...
  /* 반가워요 user */
    // axios.get('https://codingapple1.github.io/userdata.json').then((a) => {
    //   a.data
    // })
  
    // react-query 사용
    let result = useQuery('greet', () => 
      axios.get('https://codingapple1.github.io/userdata.json').then((a) => {
        console.log('요청!')
        return a.data
      }),
    /* refetch 간격 설정 */
    { staleTime : 2000 } // 2초 안에는 refetch 안됨
    )
    
    return (
    <div className="App">
	 ...
      <Navbar bg="light" variant="light">
        <Container>
          <Navbar.Brand href="#home">SinShop</Navbar.Brand>
          <Nav className="me-auto">
            <Nav.Link onClick={() => { navigate('/') }}>Home</Nav.Link>
            <Nav.Link onClick={() => { navigate('/cart') }}>Cart</Nav.Link>
            <Nav.Link onClick={() => { navigate(1) }}>앞으로가기</Nav.Link>
            <Nav.Link onClick={() => { navigate(-1) }}>뒤로가기</Nav.Link>
          </Nav>
          <Nav className="ms-auto">
            {/* { result.isLoading ? '로딩중' : result.data.name } */}
            { result.isLoading && '로딩중' }
            { result.error && '에러남' }
            { result.data && result.data.name }
          </Nav>
        </Container>
      </Navbar>
      ...
    </div>
  );
}

 

 

React-Query 장점

1. 성공 / 실패 / 로딩중 쉽게 파악 가능

result.data // 요청 성공시 data 가져옴
result.isLoading // 요청중일 때 true
result.error // 요청 실패시 true

 

2. 자동으로 재요청해줌 ( = refetch )

  * refetch 간격 설정

{ staleTime : 2000 } // 2초 안에는 refetch 안됨!

 

 

3. 실패시 retry 알아서 해줌

 

 

4. state 공유 안해도 됨

  • state 만들고 props로 전송하는 게 싫으면 컴포넌트 안에서 ajax 요청가능 - 똑같은 곳에 ajax요청을 두번이상하게되면 합쳐서 한번만 함 -> 비효율x

 

5. ajax 결과 캐싱 기능 ( = 5분동안 요청 결과 저장 )

ex)
12시 10분에 실행된 userdata.json GET 요청
12시 15분에 실행된 userdata.json GET 요청

React-Query가 12시 10분 결과를 먼저 보여줌 -> GET요청(12시 15분거) -> 12시 15분 결과 보여줌

=> 기존 성공 결과를 먼저 보여주니까 훨씬 빠른 느낌을 줌

 

 

* redux-toolkit 설치시 RTX Query도 자동설치되는데 React-Query와 유사(문법은 더 어려움)

'Library | Framework > React JS' 카테고리의 다른 글

[성능개선] 재렌더링 금지, memo, useMemo  (0) 2022.11.10
[성능개선] 개발자 도구 확장 프로그램, lazy import  (0) 2022.11.10
[React] localStorage  (0) 2022.11.09
[React] Redux  (0) 2022.11.07
[React] Context API  (0) 2022.11.05
댓글