useNavigate
概要
ユーザーのインタラクションやエフェクトに応じて、ブラウザ内でプログラム的にナビゲートできる関数を返します。
このフックを使用するよりも、action/loader 関数内で redirect を使用する方が良い場合が多くあります。
返される関数のシグネチャは navigate(to, options?) または navigate(delta) で、以下のとおりです。
toは文字列パス、Toオブジェクト、または数値 (delta) を指定できます。optionsには、ナビゲーションを変更するためのオプションが含まれます。- これらのオプションは、すべてのモード (Framework、Data、Declarative) で機能します:
relative: 相対ルーティングロジックを制御するための"route"または"path"replace:Historyスタックの現在のエントリを新しいものに置き換えます。state: 新しいLocationに含めるオプションのhistory.state
- これらのオプションは、Framework および Data モードでのみ機能します:
flushSync: DOM の更新をReactDom.flushSyncでラップします。preventScrollReset: ナビゲーション後にページの最上部までスクロールを戻しません。viewTransition: このナビゲーションのためにdocument.startViewTransitionを有効にします。
- これらのオプションは、すべてのモード (Framework、Data、Declarative) で機能します:
import { useNavigate } from "react-router";
function SomeComponent() {
let navigate = useNavigate();
return (
<button onClick={() => navigate(-1)}>
Go Back
</button>
);
}シグネチャ
function useNavigate(): NavigateFunction戻り値
プログラムによるナビゲーションのための navigate 関数。
例
別のパスにナビゲートする
navigate("/some/route");
navigate("/some/route?search=param");To オブジェクトでナビゲートする
すべてのプロパティはオプションです。
navigate({
pathname: "/some/route",
search: "?search=param",
hash: "#hash",
state: { some: "state" },
});state を使用すると、次のページの Location オブジェクトで利用できます。useLocation を使用して useLocation().state でアクセスしてください。
History スタックを前後にナビゲートする
// back
// often used to close modals
navigate(-1);
// forward
// often used in a multistep wizard workflows
navigate(1);navigate(number) を使用する際は注意が必要です。アプリケーションが、前方/後方へのナビゲートを試みるボタンを持つルートまでロードできる場合、History エントリが存在しない、または予期しない場所 (別のドメインなど) に移動する可能性があります。
ナビゲート先の History スタックにエントリが存在することが確実な場合にのみ、これを使用してください。
History スタックの現在のエントリを置き換える
これは、History スタックから現在のエントリを削除し、サーバーサイドの redirect と同様に新しいエントリに置き換えます。
navigate("/some/route", { replace: true });スクロールリセットを防ぐ
<ScrollRestoration> がスクロール位置をリセットするのを防ぐには、preventScrollReset オプションを使用します。
navigate("?some-tab=1", { preventScrollReset: true });たとえば、ページの中央に検索パラメーターに接続されたタブインターフェースがあり、タブがクリックされたときにページの上部にスクロールさせたくない場合などに使用します。
戻り値の型拡張
内部的には、useNavigate は Declarative モードと Data/Framework モードで異なる実装を使用します。主な違いは、後者がナビゲーション間で identity を変更しない安定した参照を返せる点です。Data/Framework モードの実装は、ナビゲーションが完了したときに解決される Promise も返します。これは、useNavigate の戻り値の型が void | Promise<void> であることを意味します。これは正確ですが、戻り値の union に基づいて、いくつかの赤い波線 (red squigglies) が表示される可能性があります。
typescript-eslintを使用している場合、@typescript-eslint/no-floating-promisesからエラーが表示されることがあります。- Framework/Data モードでは、
React.use(navigate())が誤検出 (false-positive) としてArgument of type 'void | Promise<void>' is not assignable to parameter of type 'Usable<void>'エラーを表示します。
これらの問題を回避する最も簡単な方法は、使用している router に基づいて型を拡張することです。
// If using <BrowserRouter>
declare module "react-router" {
interface NavigateFunction {
(to: To, options?: NavigateOptions): void;
(delta: number): void;
}
}
// If using <RouterProvider> or Framework mode
declare module "react-router" {
interface NavigateFunction {
(to: To, options?: NavigateOptions): Promise<void>;
(delta: number): Promise<void>;
}
}