React Router で現在のルートを取得
React Router v4 で現在のルートを取得する方法
React Router v4 では、withRouter
HOC (Higher-Order Component) を使用してコンポーネントにルーティング情報を受け渡すことができます。これにより、現在のルートに関する情報を取得することができます。
withRouter HOC を使用する
import { withRouter } from 'react-router-dom';
function MyComponent(props) {
const { match, location, history } = props;
// 現在のルートに関する情報を取得
const currentPath = match.path;
const currentUrl = location.pathname;
// ...
}
export default withRouter(MyComponent);
- history
ブラウザの履歴を操作するためのオブジェクトです。 - location
現在の URL に関する情報を含むオブジェクトです。pathname
: 現在の URL のパス。search
: クエリパラメータの文字列。hash
: ハッシュ部分の文字列。
- match
現在のルートに関する情報を含むオブジェクトです。path
: 現在のルートのパス。params
: URL パラメータのオブジェクト。
useLocation Hook を使用する
React Router v6 以降では、useLocation
Hook を使って現在のルート情報を取得することもできます。
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
// 現在の URL を取得
const currentUrl = location.pathname;
// ...
}
注意
- 現在のルート情報を取得する方法は、プロジェクトで使用している React Router のバージョンによって異なります。
withRouter
は React Router v4 で使用され、useLocation
は v6 以降で使用されます。
例
import { withRouter, useLocation } from 'react-router-dom';
// React Router v4
function MyComponent(props) {
const { match, location, history } = props;
const currentPath = match.path;
// ...
}
export default withRouter(MyComponent);
// React Router v6 以降
function MyComponent() {
const location = useLocation();
const currentUrl = location.pathname;
// ...
}
import { withRouter } from 'react-router-dom';
function MyComponent(props) {
const { match, location, history } = props;
// 現在のルートに関する情報を取得
const currentPath = match.path;
const currentUrl = location.pathname;
// ...
}
export default withRouter(MyComponent);
- 現在のルートの取得
match.path
で現在のルートのパスを取得できます。location.pathname
で現在の URL のパス部分を取得できます。
- props
match
: 現在のルートに関する情報を持つオブジェクトです。path
: 現在のルートのパス文字列 (e.g., "/users/:id")params
: URL パラメータのオブジェクト (e.g., { id: '123' })
location
: 現在の URL に関する情報を持つオブジェクトです。pathname
: 現在の URL のパス部分 (e.g., "/users/123")search
: クエリパラメータの文字列 (e.g., "?sort=name")hash
: ハッシュ部分の文字列 (e.g., "#top")
history
: ブラウザの履歴を操作するためのオブジェクトです。push
: 新しい履歴エントリを追加するreplace
: 現在の履歴エントリを置き換えるgoBack
: 前の履歴エントリに戻るgoForward
: 次の履歴エントリに進む
- withRouter HOC
コード例2: useLocation Hook を使用する (React Router v6 以降)
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
// 現在の URL を取得
const currentUrl = location.pathname;
// ...
}
- useLocation Hook
useLocation
は Hook で、現在の URL に関する情報を持つlocation
オブジェクトを返します。location
オブジェクトは、withRouter
のlocation
プロパティと同様の情報を持ちます。
どちらを使うべきか
- React Router v6 以降
useLocation
Hook を使用することを推奨します。useLocation
はより簡潔で、関数コンポーネントでも簡単に使用できます。 - React Router v4
withRouter
HOC を使用します。
使用例
function MyComponent(props) {
const { match, location } = props; // withRouter を使用する場合
// または
const location = useLocation(); // useLocation を使用する場合
const currentPath = match.path; // withRouter の場合
const currentUrl = location.pathname;
// 現在のルートに応じて表示内容を変える
if (currentPath === '/users') {
return <UserList />;
} else if (currentPath === '/users/:id') {
return <UserDetail userId={match.params.id} />;
} else {
return <NotFound />;
}
}
- 現在のルートの情報は、動的なルーティングや条件分岐の実現に役立ちます。
- React Router v6 以降では、
useLocation
Hook を使用するのが一般的です。 - React Router v4 では、
withRouter
HOC を使用して、現在のルートに関する情報を取得できます。
location.search
を使用して、クエリパラメータにアクセスできます。match.params
を使用して、URL パラメータにアクセスできます。history
オブジェクトを使用して、プログラムから URL を変更したり、ブラウザの履歴を操作したりすることができます。
Context API を利用する
React の Context API を利用して、ルート情報をアプリケーション全体に共有することができます。
import React, { createContext, useContext } from 'react';
import { Router } from 'react-router-dom';
// ルート情報を格納するコンテキストを作成
const RouteContext = createContext();
function App() {
return (
<RouteContext.Provider value={{ location }}>
<Router>
{/* ... */}
</Router>
</RouteContext.Provider>
);
}
function MyComponent() {
const { location } = useContext(RouteContext);
// location を使って現在のルートを取得
}
メリット
withRouter
を使うよりもシンプル- グローバルな状態管理に便利
- 状態管理ライブラリと組み合わせる必要がある場合、冗長になる可能性がある
- Context のネストが深くなると管理が複雑になる
Redux や MobX などの状態管理ライブラリを利用する
状態管理ライブラリを使って、ルート情報をストアに保存し、コンポーネントからアクセスすることができます。
// Reduxの例
import { connect } from 'react-redux';
function mapStateToProps(state) {
return {
location: state.router.location
};
}
function MyComponent(props) {
const { location } = props;
// location を使って現在のルートを取得
}
export default connect(mapStateToProps)(MyComponent);
- 他の状態と一元的に管理できる
- 大規模なアプリケーションで状態管理が複雑になる場合に有効
- 小規模なアプリケーションではオーバースペックになる可能性がある
- セットアップが複雑
どの方法を選ぶべきか
- グローバルな状態管理
Context API または状態管理ライブラリ - 大規模で複雑なアプリケーション
Redux や MobX などの状態管理ライブラリ - シンプルで小規模なアプリケーション
withRouter
または Context API
withRouter
は、現在のルート情報を簡単に取得できる便利な方法ですが、状況によっては他の方法も検討する価値があります。どの方法を選ぶかは、アプリケーションの規模、複雑さ、状態管理の要件によって異なります。
- React Router のバージョンによっては、APIが異なる場合があります。
- Context API や状態管理ライブラリを利用する場合、状態の更新方法やパフォーマンスに注意する必要があります。
- カスタムフック
useLocation
をベースに、より複雑なロジックを実装したカスタムフックを作成することも可能です。
選ぶ際のポイント
- チームの慣習
チーム内で既に利用しているライブラリや手法がある場合は、それに合わせる - パフォーマンス
大規模なアプリケーションでは、パフォーマンスを考慮する必要がある - 柔軟性
Context API や状態管理ライブラリは、より柔軟な状態管理が可能 - シンプルさ
withRouter
やuseLocation
はシンプルで使いやすい
reactjs react-router react-router-v4