싱글 페이지 어플리케이션 장점
싱글 페이지 어플리케이션 단점
라우팅이란?
리액트 라우팅 라이브러리
리액트 라우터
리액트 라우터 설치
npm install react-router-dom
리액트 라우터 생성
const router = createBrowserRouter([
{
path: "/",
element: <div>Home</div>
errorElement: <div>Page Not Found</div>
}
])
리액트 라우터 적용
const App = () => {
return <RouterProvider router={router} />
}
// App.js
const router = createBrowserRouter([
{
path: "/",
element: <div>Home</div>
errorElement: <div>Page Not Found</div>
},
{
path: "/product",
element: <div>Product</div>
errorElement: <div>Page Not Found</div>
},
])
const App = () => {
return <RouterProvidr router={router} />
}
export defualt App
// App.js
const router = createBrowserRouter([
{
path: "/",
element: <Home />, // 👈
errorElement: <NotFound /> // 👈
},
{
path: "/product",
element: <Product />, // 👈
errorElement: <NotFound /> // 👈
},
])
const App = () => {
return <RouterProvider router={router} />
}
export default App
const router = createBrowserRouter([
{
path: "/",
element: <Root />, // 👈
errorElement: <NotFound />,
children: [ // 👈
{ index: true, element: <Home /> },
{ path: "/product", element: <Product /> }
]
}
])
import Menu from './Menu';
import { Outlet } from 'react-router-dom'
const Root = () => {
return (
<div>
<Menu /> // 👈
<Outlet /> // 👈
</div>
)
}
export default Root
import { Link } from 'react-router-dom'
const Menu = () => {
return (
<div>
<Link to="/">Home</Link> // 👈
<Link to="/product">Product</Link> // 👈
</div>
)
}
export default Menu
웹 페이지에서 링크를 추가할 때 <a> 태그 사용
Link 컴포넌트
<Link to="주소">링크이름</Link>
App.js
const router = createBrowserRouter([
{
path: "/",
element: <Root />, // 👈
errorElement: <NotFound />,
children: [ // 👈
{ index: true, element: <Home /> },
{ path: "/product", element: <Product /> },
],
}
])
const App = () => {
return <RouterProvider router={router} />
}
export default App
// App.js
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
errorElement: <NotFound />,
children: [
{ index: true, element: <Home /> },
{ path: "/product", element: <Product /> },
{ path: "/product/:productId", element: <ProductInfo /> }, // 👈
],
}
])
const App = () => {
return <RouterProvider router={router} />
}
export default App
const ProductInfo = () => {
return <div>제품 상세 페이지</div>
}
export default ProductInfo
const navigate = useNavigate()
// home 경로로 이동
function goHome() {
navigate('/home')
}
const Product = () => {
const [productId, setProductId] = useState('')
const navigate = useNavigate() // 👈
const clickHandler = e => { // 👈
setProductId(e.target.value)
navigate(`/product/${productId}`)
}
return (
<>
<button onClick={clickHandler} value='p001'>1번 제품</button>
<button onClick={clickHandler} value='p002'>2번 제품</button>
<button onClick={clickHandler} value='p003'>3번 제품</button>
</>
)
}
버튼을 두 번 클릭해야 페이지가 전환되는 문제가 발생합니다.
이유
개선된 Product.js
const Product = () => {
const [productId, setProductId] = useState('')
const navigate = useNavigate()
const clickHandler = e => {
setProductId(e.target.value)
}
useEffect(() => { // 👈
navigate(`/product/${productId}`)
}, [productId])
return (
<>
<button onClick={clickHandler} value='p001'>1번 제품</button>
<button onClick={clickHandler} value='p002'>2번 제품</button>
<button onClick={clickHandler} value='p003'>3번 제품</button>
</>
)
}
URL에 포함되어 있는 파라미터 값을 가져와서 사용할 수 있도록 해주는 hooks 입니다.
사용방법
{ path: "/product/:productId", element: <ProductInfo /> }
const { productId } = useParams()
ProductInfo.js
const ProductInfo = () => {
const { productId } = useParams()
return <div>{productId} 제품 상세 페이지</div>
}
export default ProductInfo
실행 결과
그림으로 이해하기