React Router でシームレスな画面遷移を実現:useNavigation フックの使い方
React Router で URL を更新する方法:ナビゲーションや再読み込みをせずに
React Router で SPA(シングルページアプリケーション)を構築する場合、ページ全体を再読み込みせずに、URL を更新して別のコンポーネントに切り替えることが必要になります。
従来のアンカータグ (<a>) を使用すると、ページ全体が再読み込みされてしまいますが、React Router の useNavigation
フックを使用することで、URL を更新しながらも、シームレスな画面遷移を実現できます。
useNavigation
フック
useNavigation
フックは、現在のルーティング情報と、URL を変更するためのメソッドを提供します。
import { useNavigation } from 'react-router-dom';
function MyComponent() {
const navigation = useNavigation();
const handleClick = () => {
// URL を更新
navigation.push('/new-url');
};
return (
<button onClick={handleClick}>URL を更新</button>
);
}
上記の例では、handleClick
関数は navigation.push('/new-url')
を呼び出し、/new-url
という新しい URL に遷移します。しかし、この操作はページ全体を再読み込みするのではなく、URL のみ更新し、対応するコンポーネントをレンダリングします。
useNavigation
フックは、React Router v6 以降で使用できます。- URL を更新する以外にも、
navigation
オブジェクトを使用して、履歴操作(goBack
、replace
など)を実行することもできます。 - URL を更新してもコンポーネントが再描画されないようにするには、
useMemo
やuseEffect
などのフックを適切に使用する必要があります。
import React from 'react';
import { useNavigation } from 'react-router-dom';
function MyComponent() {
const navigation = useNavigation();
const handleClick = () => {
// URL を更新
navigation.push('/new-url');
};
return (
<div>
<p>現在の URL: {window.location.href}</p>
<button onClick={handleClick}>URL を更新</button>
</div>
);
}
export default MyComponent;
このコードの説明
useNavigation
フックを使用して、navigation
オブジェクトを取得します。handleClick
関数を作成します。handleClick
関数内で、navigation.push('/new-url')
を呼び出して、/new-url
という新しい URL に遷移します。- コンポーネントをレンダリングし、現在の URL と "URL を更新" ボタンを表示します。
実行方法
- このコードを React コンポーネントとして保存します。
- React アプリケーションで、このコンポーネントをレンダリングします。
- "URL を更新" ボタンをクリックすると、URL が
/new-url
に更新され、ページ全体が再読み込みされることなく、新しいコンポーネントが表示されます。
- この例では、
window.location.href
を使用して現在の URL を取得しています。 - 実際のアプリケーションでは、
useLocation
フックを使用して、より詳細なルーティング情報にアクセスすることができます。 - ボタンをクリックした後に何かアクションを実行する場合は、
useEffect
フックを使用して、URL の変更を検知し、必要な処理を実行することができます。
Link
コンポーネントは、ナビゲーションリンクを作成するための React Router の標準コンポーネントです。to
プロパティを使用して、遷移先の URL を指定することができます。
import React from 'react';
import { Link } from 'react-router-dom';
function MyComponent() {
return (
<div>
<Link to="/new-url">新しい URL に移動</Link>
</div>
);
}
export default MyComponent;
上記の例では、<Link to="/new-url">新しい URL に移動</Link>
タグをクリックすると、/new-url
という新しい URL に遷移します。
history オブジェクト
history
オブジェクトは、ブラウザの履歴を操作するための API を提供します。URL を更新するには、pushState
メソッドを使用することができます。
import React from 'react';
import { useHistory } from 'react-router-dom';
function MyComponent() {
const history = useHistory();
const handleClick = () => {
// URL を更新
history.pushState({}, '', '/new-url');
};
return (
<button onClick={handleClick}>URL を更新</button>
);
}
export default MyComponent;
上記の例では、handleClick
関数は history.pushState({}, '', '/new-url')
を呼び出し、/new-url
という新しい URL に遷移します。
window.location オブジェクト
window.location
オブジェクトは、現在の URL を取得したり、新しい URL に直接遷移したりするための API を提供します。
import React from 'react';
function MyComponent() {
const handleClick = () => {
// URL を更新
window.location.href = '/new-url';
};
return (
<button onClick={handleClick}>URL を更新</button>
);
}
export default MyComponent;
注意事項
history
オブジェクトとwindow.location
オブジェクトを使用する場合は、ブラウザの履歴と状態を適切に更新する必要があります。- これらの方法は、
useNavigation
フックよりも低レベルな操作を行うため、注意して使用する必要があります。
useNavigation
フックは、React Router で URL を更新するための最も推奨される方法です。しかし、状況によっては、Link
コンポーネント、history
オブジェクト、window.location
オブジェクトなどの他の方法を使用することもできます。
javascript reactjs react-router