728x90
react-router-dom v5 → v6
react-router-dom v5
import {
BrowserRouter,
Route,
Redirect,
Switch
} from 'react-router-dom';
<BrowserRouter >
<Switch>
<Route path="/" exact>
<Users />
</Route>
<Route path="/places/new" exact>
<NewPlace />
</Route>
<Redirect to="/" />
</Switch>
</BrowserRouter >
- Switch:
- Switch 컴포넌트는 그 안에 포함된 Route 중에서 첫 번째로 매칭되는 경로만 렌더링합니다.
- 여러 Route 중에서 하나만 렌더링하고자 할 때 사용합니다.
- 일반적으로 정확한 경로 매칭을 위해 사용됩니다.
- Route:
- Route 컴포넌트는 URL 경로와 컴포넌트를 매핑합니다.
- 특정 URL 경로가 요청되었을 때 해당 경로에 매칭되는 컴포넌트를 렌더링합니다.
- path prop을 통해 URL 경로를 지정하고, component 또는 render prop을 통해 렌더링할 컴포넌트를 지정합니다.
- exact:
- exact prop은 Route 컴포넌트에 사용되며, 경로가 정확히 일치할 때만 해당 **Route**가 렌더링되도록 지정합니다.
- 예를 들어, **/about**과 /about/contact 두 경로가 있을 때, /about 경로에 exact prop을 사용하면 **/about/contact**와 같이 부분적으로 매칭되는 경로가 아닌 정확히 /about 경로일 때만 해당 **Route**가 렌더링됩니다.
이것들을 종합하면, **Switch**는 여러 Route 중에서 하나만 렌더링하고, **exact**는 정확한 경로 매칭을 지정하여 해당 **Route**가 정확히 일치할 때만 렌더링됩니다.
react-router-dom v6
import {
BrowserRouter,
Route,
Routes,
Navigate
} from 'react-router-dom'
<BrowserRouter>
<Routes>
<Route path="/" element={<Users />} />
<Route path="/places/new" element={<NewPlace />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
- Switch 대신 Routes 사용:
- React Router v6에서는 Switch 대신에 각각의 Routes 컴포넌트를 사용합니다.
- 따라서 각 경로에 해당하는 Route 컴포넌트를 개별적으로 정의해야 합니다.
- Navigate 컴포넌트:
- v6에서는 Navigate 컴포넌트를 사용하여 프로그래밍 방식으로 페이지를 이동할 수 있습니다.
- 위의 예시에서는 Navigate 컴포넌트를 사용하여 모든 경로가 일치하지 않을 때 기본적으로 "/" 경로로 이동하도록 설정되어 있습니다.
<Route element={}> 장점
React Router v5에서 v6로의 변경으로 인해 API가 단순화되고 중첩된 경로 및 속성 전달이 개선되었습니다. 주요 변경 사항은 다음과 같습니다:
요소(element) 사용:
- v6에서는 element prop을 사용하여 렌더링할 컴포넌트를 지정합니다.
- 이는 React의 <Suspense> API와 유사하며, 간단하고 직관적인 API를 제공합니다.
// v6 Route 사용법
<Route path=":userId" component={Profile} />
// 만약, 커스텀 props를 <Profile> 요소에 전달하는 방법은 무엇일까?
// 어떤 경우에는 render prop을 사용할 수 있을까?
<Route
path=":userId"
render={routeProps => (
<Profile routeProps={routeProps} animate={true} />
)}
/>
// 좋아, 이제 우리는 경로와 함께 무언가를 렌더링하는 두 가지 방법이 있습니다. :/
// 하지만, URL과 일치하지 않을 때 무언가를 렌더링하려면 어떻게 해야 할까?
// 다른 의미를 가진 render prop을 사용할 수 있을까?
<Route
path=":userId"
children={({ match }) => (
match ? (
<Profile match={match} animate={true} />
) : (
<NotFound />
)
)}
/>
사용자 정의 props 전달:
- 요소를 사용하면 속성을 직접 전달할 수 있어서 passProps 구성 요소를 사용하지 않아도 됩니다.
- 이로 인해 컴포넌트 기반 API가 단순화되었습니다.
// v6 Route 사용법
<Route path=":userId" element={<Profile />} />
// 어떻게 <Profile> 요소에 사용자 정의 props를 전달할까?
<Route path=":userId" element={<Profile animate={true} />} />
// URL 매개변수나 현재 위치와 같은 라우터 데이터에 어떻게 접근할까?
function Profile({ animate }) {
let params = useParams();
let location = useLocation();
}
중첩된 라우팅:
- 중첩된 라우팅을 위해 **<Route>**가 children prop을 사용하게 되었습니다.
- 중첩된 경로는 상위 경로에 추가하여 경로를 구축하며, 중첩된 UI 레이아웃을 쉽게 구성할 수 있습니다.
// React Router v6 앱
import {
BrowserRouter,
Routes,
Route,
Link,
Outlet,
} from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="users" element={<Users />}>
<Route path="me" element={<OwnUserProfile />} />
<Route path=":id" element={<UserProfile />} />
</Route>
</Routes>
</BrowserRouter>
);
}
function Users() {
return (
<div>
<nav>
<Link to="me">내 프로필</Link>
</nav>
<Outlet />
</div>
);
}
이러한 변경 사항은 React Router를 더 간편하고 직관적으로 사용할 수 있도록 만들어 주며, 개발자들이 중첩된 라우팅 및 속성 전달을 보다 쉽게 다룰 수 있도록 도와줍니다.
728x90
'Front-End > React' 카테고리의 다른 글
리액트 컴포넌트 패턴: 프레젠테이션 vs 컨테이너 (0) | 2024.02.19 |
---|---|
useState() 리액트 상태 관리 마스터하기 (0) | 2024.02.13 |
React 동작 과정 (0) | 2024.01.08 |
React18 변경한 부분 (0) | 2023.12.01 |
React 렌더링 (0) | 2023.09.23 |