React Router v5とv6:違いを比較してみた
React RouterはReactアプリケーションのためのデクララティブなルーティングライブラリであり、シングルページアプリケーション (SPA) の構築を容易にします。
本記事では、React Router v5とv6の主な違いと、その詳細な解説、および実際のコード例を示しながら、v5からv6への移行方法を説明します。
React Router v5とv6の違い
以下に、React Router v5とv6の主な違いをまとめます。
- Routeの指定方法
- Switchの廃止
- Outletの導入
- relative pathの利用
- useRouteMatchの廃止
Routeの指定方法
React Router v5では、Route
コンポーネントのcomponent
属性に指定していましたが、v6ではelement
属性にReact要素を指定します。
v5の例:
<Route path="/about" component={About} />
v6の例:
<Route path="/about" element={<About />} />
この変更により、コンポーネントのインスタンスを直接渡すことができ、より直感的でわかりやすいコードになります。
Switchの廃止
React Router v6では、Switch
コンポーネントが廃止され、Routes
コンポーネントを使います。Routes
はSwitch
と同様に、最初にマッチしたRoute
コンポーネントのみをレンダリングします。
v5の例:
<Switch>
<Route exact path="/" component={Home} /><Route path="/about" component={About} />
</Switch>
v6の例:
<Routes>
<Route path="/" index element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
Routesの方が直感的な命名だと個人的には思います。
Outletの導入
v6ではネストされたルーティングを実現するために、Outlet
コンポーネントが導入されます。Outlet
は、ネストされたルートのコンポーネントをレンダリングする場所を指定します。
v5の例:
<Route path="/user">
<UserProfile>
<Route path="/user/posts" component={Posts} />
<Route path="/user/comments" component={Comments} />
</UserProfile>
</Route>
v6の例:
function UserProfile() {
return (
<div>
<Outlet />
</div>
);
}
v6では、UserProfile
コンポーネントにOutlet
を配置して、ネストされたルートのコンポーネントが表示される場所を設定します。これにより、親コンポーネント内で子ルートの表示位置を制御できるようになります。
relative pathの利用
React Router v6では、Link
やRoute
コンポーネントで相対パスを利用できるようになります。これにより、アプリケーションの構造を変更する際にルーティングの修正が容易になります。
v5の例:
<Route path="/user/posts" component={Posts} />
<Link to="/user/posts">Posts</Link>`
v6の例:
<Route path="posts" element={<Posts />} />
<Link to="posts">Posts</Link>
v6では、親ルートとの相対パスを使ってルーティングを定義できます。これにより、ルーティング定義がシンプルになり、アプリケーションの構造変更にも柔軟に対応できます。
useRouteMatchの廃止
React Router v6では、useRouteMatch
が廃止され、代わりにuseMatch
が導入されます。useMatch
は、与えられたパスが現在のURLとマッチするかどうかをチェックし、マッチした場合はそのマッチオブジェクトを返します。
v5の例:
function NavLink({ to, children }) {
const match = useRouteMatch({ path: to, exact: true });
return <Link to={to}>{match ? <strong>{children}</strong> : children}</Link>;
}
v6の例:
function NavLink({ to, children }) {
const match = useMatch(to);
return <Link to={to}>{match ? <strong>{children}</strong> : children}</Link>;
}
useMatch
は、useRouteMatch
と同様に、現在のURLと指定したパスがマッチするかどうかを判断するために使用されますが、よりシンプルなAPIで提供されています。useMatch
は、与えられたパスが現在のURLとマッチするかどうかをチェックし、マッチした場合はそのマッチオブジェクトを返します。これにより、例えばナビゲーションリンクで現在のページを強調表示するなどの実装が容易になります。
まとめ
本記事では、React Router v5とv6の主な違いを実際のコード例を示しながら、v5からv6への移行方法を説明しました。v6には、コードの簡潔さ、柔軟性の向上、ネストされたルーティングの改善などがあり、より快適になったのではないかと思います。
Discussion