본문 바로가기
React

[React-Router] v6로 적용하기

by 곰돌찌 2021. 11. 26.

리액트의 단짝친구 리액트 라우터가 v6 버전이 나왔다..!

새로운 프로젝트에 들어가면서 리액트 라우터 v6 버전을 쓰게 되었는데 사용하면서

간단하게 달라진 점들을 정리해보고자 한다!

 

v5에서 v6 로 마이그레이션 하는 부분은 공식문서 참고

https://reactrouter.com/docs/en/v6/upgrading/v5#upgrading-from-v5

 

React Router | Upgrading from v5

Declarative routing for React apps at any scale

reactrouter.com

 

1. <Switch> 에서 <Routes>로!

일단 큰 부분은 Switch 대신 Routes로 네이밍이 변경되었다. 이름이 변경된거지만 뭔가 REST 스러운..느낌?

Routes 하위에는 Route가 여러개 존재하게 된다! 👏👏👏

 

그리고 Route도 일부 변경이 되었는데 component 속성 대신 element가 났고 해당 속성에는 JSX의 형태로 태그와 함께 표현된다.

// v5

<Switch>
  <Route path="/login" component={Login} />
</Switch>

// v6
<Routes>
  <Route path="/login" element={<Login />} />
</Routes>

 

2. exact는 안녕!

명시적으로 해당 url에만 접근가능하도록 위해 exact는 필수였다. 하지만 v6에서는 아예 기본 전제가 바뀌어서 exact가 기본으로 되어있어 exact 속성이 사라지게 되었다.

그렇다면 exact 없이 있는 url 형식으로 구성하기 위해서는 * 를 사용하도록 권고한다.

//v6
<Routes>
  <Route path="member/*" element={<Member />} />
</Routes>

 

3. <Redirect />는 사라지고 ...

Redirect가 사라지고 Routes안에는 Route만 넣을 것을 권고하고 있다. 
Redirect는 Route 아래 element 속성에 Navigate로 replace속성과 to="url" 속성을 넣어줘서 redirect가 가능하도록 한다.

조금 더 불편해지긴 했지만..! 어떻게 보면 직관적인 느낌이 들수도 있는 것 같다(🥲

// v5

<Switch>
  <Redirect exact patch="/" to="login" />
</Switch>

// v6
<Routes>
  <Route path="/" element={<Navigate replace to="/login"/>} />
</Routes>

6. 중첩 라우팅

중첩 라우팅이 좀더 직관적?이게 되었다. 컴포넌트의 children과 같은 개념으로 중첩이 가능해졌다.

만약, member 와 member/:memberId 페이지가 있다고 한다면, 이전에는 각각 한줄씩 차지하였는데, v6에서는 member 라우트 하위에 :memberId 가 포함된 Route를 추가하면 중첩 라우팅이 된다. 하위에 있으면 자동으로 / 로 구분되기 떄문에 추가적인 / 를 path에 추가할 필요가 없어졌다.

직관적이라고 생각해서 좋아했는데 사실 여러 페이지를 쓰니까 뭔가 보기가 더 애매해진느낌..? 중복되는 코드를 줄인건 좋은것 같다..!

 

//v5
<Switch>
  <Route path="/member" />
  <Route path="/member/:memberId" />
</Switch>

//v6
<Routes>
  <Route path="/member">
    <Route path=":memberId" /> // /member/:memberId
  </Route>
</Routes>

 

 

5. 레이아웃

레이아웃 설정이 매우 간단해졌다. 중첩 라우팅의 구성이 되면 Outlet을 통해서 상위의 컴포넌트를 레이아웃화 할 수 있다.

이전에는 {children}을 사용해서 layout을 구성한다음에 라우트에 항상 레이아웃과 연결짓도록 했는데

<Outlet /> 을 사용하면 {children} 을 사용하는 것과 같은 효과가 난다!

 

<Routes>
  <Route path="/member" element={<Member />}>
  	<Route path=":memberId" element={<MemberInfo />} />
  </Route>
</Routes>


{/* Member */}
<div>
  <header>Member</header>
  <Outlet />  {/* MemberInfo의 component가 Outlet의 위치에 위치하게 된다. */}
</div>

 

더 많은 것들이 변경되었겠지만.. 

일단 사용한 부분에 대한 부분 기준으로 작성해보았다!

 

뭔가 편해진듯 안편해진듯..!🤷🏻‍♀️

 

자고일어나면 변화하는 프론투 생태계..!

빠릿빠릿하게 적응해야겠다..! (안됨

댓글