router 셋팅
- index.js 파일에 react-router-dom import한다.
- BrowserRouter로 App을 감싼다.
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
router로 페이지 나누기
- App.js파일 상단에 여러거지 컴포넌트를 import 한다.
- 만들고 그 안에 를 작성
- <Route path="/url경로" element={ <보여줄html> } /> 경로를 설정함.
(App.js)
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>
)
}
페이지 이동 버튼
- react-router-dom에서 Link 컴포넌트 import 한다.
- 원하는 곳에 쓰면된다.
<Link to="/">홈</Link>
<Link to="/detail">상세페이지</Link>
useNavigate
- 페이지 이동 기능 useNavigate()
import { Routes, Route, Link, useNavigate, Outlet } from 'react-router-dom'
function App(){
let navigate = useNavigate()
return (
<Nav.Link onClick={()=>{ navigate(-1)}}></Nav.Link>
<Nav.Link onClick={()=>{ navigate(2)}}></Nav.Link>
<button onClick={()=>{ navigate('/detail') }}>이동버튼</button>
)
}
- 404 페이지 작성방법
<Route path="*" element={ <div>없는페이지임</div> } />
- 서브경로 만드는 nested routes
<Route path="/about" element={ <About/> } >
<Route path="member" element={ <div>멤버들</div> } />
<Route path="location" element={ <div>회사위치</div> } />
</Route>
function About(){
return (
<div>
<h4>about페이지임</h4>
<Outlet></Outlet>
</div>
)
}
URL파라미터으로 상세페이지 만들기
- 데이터를 props로 다른페이지로 전송
(App.js)
<Route path="/detail/:id" element={ <Detail shoes={shoes}/> }/>
(Detail.js)
import { useParams } from 'react-router-dom'
function Detail(){
let {id} = useParams();
console.log(id)
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 mt-4">
<h4 className="pt-5">{props.shoes[id].title}</h4>
<p>{props.shoes[0].content}</p>
<p>{props.shoes[0].price}원</p>
<button className="btn btn-danger">주문하기</button>
</div>
</div>
</div>
)
}
참고 문헌 및 사이트