애플리케이션에서도 여러 상세 페이지가 있을 것.
만약 Js라면,
1. html파일을 각기 다르게 만들고
2. /detail로 접속하면 해당 html파일을 보내줌
이러한 스텝으로 코드를 짤 수 있다.
하지만 react는 index.html로 하나의 html만을 갖는다.
따라서 React에서는,
1. 컴포넌트를 만들어서 페이지에 해당되는 컴포넌트로 채움
2. /detail로 접속하면 그 컴포넌트 보여줌
이걸 모두 조건으로 처리해야하는데
직접 코드를 짜려면 너무나 귀찮을듯..
그래서 쓰는 라이브러리 👉 React-router-dom
npm install react-router-dom@6 //6버전 설치한다는 소리
BrowserRouter
를 import해오고<App/>
을 <BrowserRouter> </BrowserRouter>
로 감싸준다. import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
<Routes>
만들고 그 안에 <Route>
를 작성한다.<Route path="/url경로" element={ <보여줄html> } />
구조로 작성. import { Routes, Route, Link } from 'react-router-dom'
function App(){
return (
(생략)
<Routes>
<Route path="/" element={ <div>메인페이지임</div> } />
<Route path="/detail" element={ <div>상세페이지임</div> } />
<Route path="/about" element={ <div>어바웃페이지임</div> } />
</Routes>
)
}
<Link to="/">홈</Link>
<Link to="/detail">상세페이지</Link>
function Detail(){
return(
<div className="container">
<div className="row">
<div className="col-md-6">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
</div>
<div className="col-md-6">
<h4 className="pt-5">상품명</h4>
<p>상품설명</p>
<p>120000원</p>
<button className="btn btn-danger">주문하기</button>
</div>
</div>
</div>
)
}
export default Detail;
import Detail from './Detail';
<div className="App">
<Link to="/">홈</Link>
<Link to="/detail">상세페이지</Link>
<Navbar bg="dark" variant="dark">
<Container>
<Navbar.Brand href="#home">Navbar</Navbar.Brand>
<Nav className="me-auto">
<Nav.Link href="#home">Home</Nav.Link>
<Nav.Link href="#features">Features</Nav.Link>
<Nav.Link href="#pricing">Pricing</Nav.Link>
</Nav>
</Container>
</Navbar>
<Routes>
<Route path="/" element={ //메인페이지
<>
<div className="main-bg"></div>
<div className='container'>
<Row>
{/* <Card shoes={shoes[0]} i={1}></Card>
<Card shoes={shoes[1]} i={2}></Card>
<Card shoes={shoes[2]} i={3}></Card> */}
{
shoes.map((item, index)=>{
return(
<Card shoes={shoes[index]} i={index+1}></Card>
)
})
}
</Row>
</div>
</>
}/>
<Route path="/detail" element={ <Detail/> }/> //상세페이지
</Routes>
이렇게 페이지별로 들어갈 html요소들을 하나의 파일안에, 하나의 컴포넌트로 만들어 App.js에 경로마다 맞춰 끼어넣어주면 깔끔하게 구현할 수 있다!
💡 리액트 폴더 구조
src안에
route는 따로 route 혹은 pages,
component는 따로 component의
하위폴더를 만들어 관리해주면 더욱 직관적일듯