React-Router-Dom v6
✔ React-Router-Dom v6
기존 React-Router-Dom v5에서 v6로 넘어가면서, 사용법이 바뀌고 기능이 추가되는 등 큰 변화가 있었다.
대표적으로 변경된 것, 간단한 사용법을 정리한다.
1. Routes
① Switch의 네이밍이 Routes로 변경되었다.
② exact 옵션이 제거되었다.
③ component, render props가 제거되고 element props가 생겼다.
④ path props에 상대경로로 지정이 가능해졌다.
// v5
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</BrowserRouter>
);
}
// v6
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="about" element={<About />} />
<Route path="/*" element={<Page404 />} />
</Routes>
</BrowserRouter>
);
}
위와 같이 사용할 수 있다.
2. 중첩 라우팅
v6 에서는 중첩 라우팅을 가독성 있게 설정할 수 있고 관리가 용이하다.
// v5
function App() {
return (
<BrowserRouter>
<Route path="/users" component={Users} />
<Route path="/users/:userId" component={User} />
</BrowserRouter>
);
}
// v6
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/users" element={<Users />}>
<Route path=":userId" element={<User />} />
</Route>
</Routes>
</BrowserRouter>
);
}
위와 같이 바로 중첩 라우팅을 설정할 수도 있지만 Outlet을 사용하면 좀 더 효율적으로 사용할 수 있다.
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
</BrowserRouter>
);
}
function Layout() {
return (
<div>
<h1>My Website</h1>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<hr />
<Outlet />
</div>
);
}
v5 였다면 각 컴포넌트에 레이아웃을 포함 시켜야했을 로직을 위처럼 Outlet과 중첩 라우팅을 이용하여 코드 가독성과 관리를 용이하게 할 수 있다.
3. Hooks
① useLocation
function MyComponent() {
const location = useLocation();
return (
<div>
{location.pathname === '/' && <h2>Home Page</h2>}
{location.pathname === '/about' && <h2>About Page</h2>}
</div>
);
}
기존 v5의 사용법과 크게 다르지 않고, 위와 같이 useLocation을 이용하여 pathname을 가져와 사용할 수 있다.
② useParams
function User() {
const params = useParams();
return <h2>User ID: {params.userId}</h2>;
}
기존 v5의 사용법과 크게 다르지 않고, 위와 같이 useParams를 이용하여 파라미터를 사용할 수 있다.
③ useRoutes
기존 React-Router-Config가 hook으로 변경되었다.
패키지를 추가해야했던 것과 다르게 hook을 이용하여 routes를 구성할 수 있게 되었다.
function App() {
let element = useRoutes([
{
path: '/',
element: <Dashboard />,
children: [
{ path: 'messages', element: <DashboardMessages /> },
{ path: 'tasks', element: <DashboardTasks /> },
],
},
{ path: 'team', element: <AboutPage /> },
]);
return element;
}
위와 같이 useRoutes를 사용하여 tree 형태로 구성할 수 있다.
4. useNavigate
① useNavigate
v5 까지 존재하던 useHistory가 제거되고 useNavigate라는 hook이 생겼다.
// v5
function App() {
let history = useHistory();
function handleClick() {
history.push('/home');
}
return (
<div>
<button onClick={handleClick}>go home</button>
</div>
);
}
// v6
function App() {
let navigate = useNavigate();
function handleClick() {
navigate('/home');
}
return (
<div>
<button onClick={handleClick}>go home</button>
</div>
);
}
v6에서는 위와 같이 사용하고, history.push, history.replace를 모두 navigate라는 키워드로 사용한다.
replace 기능의 경우 navigate(to, { replace: true }) 와 같이 사용할 수 있다.
② go, goBack, goForward
useHistory의 기능 { go, goBack, goForward } 의 사용 방식이 변경되었다.
해당 위치로, 이전으로, 다음으로의 기능이었는데 navigate로 통일하고 index를 넣는 방식으로 변경되었다.
// v5
function App() {
const { go, goBack, goForward } = useHistory();
return (
<>
<button onClick={() => go(-2)}>Go 2 pages back</button>
<button onClick={goBack}>Go back</button>
<button onClick={goForward}>Go forward</button>
<button onClick={() => go(2)}>Go 2 pages forward</button>
</>
);
}
// v6
function App() {
const navigate = useNavigate();
return (
<>
<button onClick={() => navigate(-2)}>Go 2 pages back</button>
<button onClick={() => navigate(-1)}>Go back</button>
<button onClick={() => navigate(1)}>Go forward</button>
<button onClick={() => navigate(2)}>Go 2 pages forward</button>
</>
);
}
위와 같이 navigate(${index})를 사용하는 방식으로 변경되었다.
📂 참고자료