Routing (라우팅) 은 주소에 따라 다른 화면을 보여주는 것이다. MPA(Multi Page App) 에서 href 와 같이 링크로 다른 html 을 렌더링해주었던 것과 달리, SPA 는 Router 를 통해 하나의 페이지 안에서 js 파일을 통해 필요한 데이터만 렌더링해준다.
v6 이전의 route는 exact 키워드를 통해 정확히 일치하는 경로를 지정했고, Switch 컴포넌트 안에서 route 를 두어, 일치하는 첫번째 컴포넌트만 렌더링하게 했다.
import React from "react"
import { Routes } from "react-router-dom"
import { Route } from "react-router"
import Home from "~/pages/Home"
import PageA from "~/pages/PageA"
function RootRouter() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/a/*" element={<PageA />} />
</Routes>
)
}
export default RootRouter
route로 설정한 컴포넌트는 3가지의 Props 를 받는다
import React from "react"
import { Routes, Link } from "react-router-dom"
import { Route } from "react-router"
import Home from "~/pages/Home"
import PageA from "~/pages/PageA"
function RootRouter() {
return (
<>
<nav>
<ul>
<li>
<Link to={"/"}>home</Link>
</li>
<li>
<Link to={"/a"}>a</Link>
</li>
</ul>
</nav>
<hr />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/a/*" element={<PageA />} />
</Routes>
</>
)
}
export default RootRouter
<nav>...</nav><hr /><Routes>...</Routes> 를 <></>(fragement)로 감싼 이유 -> 리액트 컴포넌트 함수는 하나의 엘리먼트만 반환해야한다
import React from "react"
import styled from "styled-components"
import { NavLink } from "react-router-dom"
export interface INavButton {
to: string
label: string
}
function NavButton(props: INavButton) {
const { to, label } = props
return (
<SNavLink activeClassName={"active"} to={to}>
{label}
</SNavLink>
)
}
export default NavButton
const SNavLink = styled(NavLink)<{ activeClassName: string }>`
padding: 0 16px;
color: ${(props) => props.theme.color.White};
&.${(props) => props.activeClassName} {
color: ${(props) => props.theme.color.Primary};
text-decoration: underline;
}
`
위 코드에 SNavLink 는 Styled Component인데, 컴포넌트를 기반으로 CSS를 작성할 수 있게 도와주는 라이브러리이다.