Develop record

[React] react - query , lazy, suspend 본문

Frontend/React

[React] react - query , lazy, suspend

seong's log 2024. 3. 31. 20:11

app.js

import logo from './logo.svg';
import './App.css';
import {Button, Navbar, Container, Nav, Col, Row} from 'react-bootstrap'
import img from './img/react-img.png';
import {Suspense, lazy, useState } from 'react';
import data from './data.js';
import Main from './routes/main.js';
//import Detail from './routes/detail.js';
import Event from './routes/event.js';
import About from './routes/about.js';
import {Service,Coupon} from './components/eventCompo.js';
import { Routes, Route, Link, useNavigate, Outlet} from 'react-router-dom';
//import Cart from './routes/cart.js';
import axios from 'axios';
import { useQuery } from 'react-query';

// 첫 화면에서 보이지 않는 컴포넌트들은 필요할 때  import 해줘
// 단점 : 로딩이 늦어짐 -> 지연될 것 같은 페이지에 <Suspense>로 감싸면 로딩중 UI넣기 가능
// Routes 전체를 Suspense 감싸도 됨
const Detail = lazy(()=> import('./routes/detail.js'))
const Cart = lazy(()=> import('./routes/cart.js'))

function App() {

  let [shoes,setShoes] = useState(data)
  let navigate = useNavigate() // 페이지 이동

  // react-query ajax 요청
  // 성공 실패 로딩중 쉽게 파악가능
  let result = useQuery('작명',()=>{
    return axios.get('https://codingapple1.github.io/userdata.json').then((a)=>{
    // 자동 refetch : 다른곳 갔다와도 요청
    console.log ('요청')  
    return a.data
    })
     //staleTime : refech 타임 설정 ( 2초에 한번 씩 요청)
  },{staleTime : 2000})

  // 실패 시 알아서 retry
  //result.data //성공시 데이터
  //result.isLoading //로딩 중 true
  //result.error //실패 시 true
  // 하위 컴포넌트에서 똑같은 곳으로 ajax 요청 해도 한번만 함 -> state 공유 할 필요 없음

  return (
    <div className="App">

       <Navbar bg="dark" variant="dark">
        <Container>
        <Navbar.Brand href="/">Shop</Navbar.Brand>
        <Nav className="me-auto">
          <Nav.Link onClick={()=>{navigate('/')}}>Home</Nav.Link> {/* navigate(1 : -> 앞으로가기 / -1 : <- 뒤로가기) */}
          <Nav.Link onClick={()=>{navigate('/detail')}}>Detail</Nav.Link>
          <Nav.Link onClick={()=>{navigate('/cart')}}>Cart</Nav.Link>
          <Nav className='ms-auto' style={{color:'white'}}>
            { result.isLoading ? '로딩증' : result.data.name}
            {result.error &&'에러'}
            {}
          </Nav>
        </Nav>
        </Container>
      </Navbar>
 
      <Routes>
          <Route path='/' element={<Main shoes={shoes} setShoes={setShoes}/>}/>  
          <Route path='/detail/:id' element={
          <Suspense fallback={<div>로딩중</div>}> 
          <Detail shoes={shoes}/>
          </Suspense>
          }/>  
          <Route path='*' element={<div>없는페이지</div>}/>

          <Route path='/about' element={<About/>}> 
            <Route path='member' element={<div>member</div>}/>  
            <Route path='location' element={<div>location</div>}/>  
          </Route>  

          <Route path='/event' element={<Event/>}> 
            <Route path='one' element={<Service/>}/>  
            <Route path='two' element={<Coupon/>}/>  
          </Route>  
          <Route path='/cart' element={
          <Suspense>
          <Cart/>
          </Suspense>
          }/>
        </Routes>
        
      </div>

  );
}

export default App;

index.js

root.render(
  //<React.StrictMode>
  <QueryClientProvider client={queryClient}>
    <Provider store={store}>
      <BrowserRouter>
      <App />
      </BrowserRouter>
    </Provider>
    </QueryClientProvider>
  //</React.StrictMode>
);

'Frontend > React' 카테고리의 다른 글

[React] memo  (0) 2024.03.31
[React] Redux state 변경  (0) 2024.03.29
[React] Redux 셋팅 / state 만들기  (0) 2024.03.26
[React] Context API  (0) 2024.03.26
[React] 애니메이션-transition  (0) 2024.03.25