[REACT] 8_브라우저 라우터 준비 및 상세페이지 라우팅

2021. 12. 27. 13:06React/React 쇼핑 앱

반응형

브라우저 라우터 라이브러리 추가

yarn add react-router-dom@5

index.js

더보기
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';


ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

Detail.js

더보기
function Detail(props) {
  return (
    <div></div>
  )
}

export default Detail;

 

App.js

더보기
import logo from './logo.svg';
import './App.css';
import { Navbar, NavDropdown, Nav, Container } from 'react-bootstrap';
import Shoes1 from './api/shoes1.json';
import { useState } from 'react';
import axios from 'axios';
import { Route, Switch } from 'react-router-dom';
import Detail from './Detail';

function App() {

  let [ shoes, setShoes ] = useState(Shoes1);
  let [ pageIdx, setPageIdx ]= useState(2);

  return (
    <div className="App">
      {/* NavBar */}
      <Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
        <Container>
          <Navbar.Brand href="/">React-Bootstrap</Navbar.Brand>
          <Navbar.Toggle aria-controls="responsive-navbar-nav" />
          <Navbar.Collapse id="responsive-navbar-nav">
            <Nav className="me-auto">
              <Nav.Link href="/">Home</Nav.Link>
              <Nav.Link href="#pricing">Pricing</Nav.Link>
              <NavDropdown title="Dropdown" id="collasible-nav-dropdown">
                <NavDropdown.Item href="#action/3.1">Action</NavDropdown.Item>
                <NavDropdown.Item href="#action/3.2">Another action</NavDropdown.Item>
                <NavDropdown.Item href="#action/3.3">Something</NavDropdown.Item>
                <NavDropdown.Divider />
                <NavDropdown.Item href="#action/3.4">Separated link</NavDropdown.Item>
              </NavDropdown>
            </Nav>
            <Nav>
              <Nav.Link href="#login">로그인</Nav.Link>
              <Nav.Link eventKey={2} href="#join">
                회원가입
              </Nav.Link>
            </Nav>
          </Navbar.Collapse>
        </Container>
      </Navbar>

      <Switch>
        <Route exact path='/'>
          {/* jumbotron */}
          <div class="bg-light p-5 rounded-lg">
            <h1 class="display-4">Hello, world!</h1>
            <p class="lead">This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
            <hr class="my-4" />
            <p>It uses utility classes for typography and spacing to space content out within the larger container.</p>
            <a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a>
          </div>
          {/* card contents */}
          <div className='container'>
            <div className='row'>
              {
                shoes.map((obj, i) => {
                  return <Card key={i} i={i} shoes={shoes} />
                })
              }
            </div>
          </div>
          {/* more button */}
          <a class="btn btn-secondary btn" role="button" onClick={() => {
            axios.get('https://ksky216.github.io/json/data' + pageIdx + '.json').then((resp) => {
              setShoes([
                ...shoes,
                ...resp.data
              ]);
              setPageIdx(pageIdx + 1);
            }).catch((e) => {
              console.log(e);
            });
          }}>더보기</a>
        </Route>
        <Route exact path="/detail/:id">
          <Detail />
        </Route>
      </Switch>
    </div>
  );
}

function Card(props) {
  return (
    <>
      <div className='col-md-4'>
        <img src={ props.shoes[props.i].image } alt="신발" width="100%" />
        <h3>{ props.shoes[props.i].title }</h3>
        <p>{ props.shoes[props.i].content } & { props.shoes[props.i].price }</p>
      </div>
    </>
  )
}

export default App;

 

반응형