useRouter()とは? Linkとの違いとページ遷移の基本を初心者向けに解説


Next.js・microCMS 初心者ノート

useRouter()とは? Linkとの違いとページ遷移の基本を初心者向けに解説

useRouterとは?Linkとの違いとページ遷移の基本を初心者向けに解説

Next.jsでページを移動するときは、 Linkのほかに useRouter()を使う方法があります。
どちらもページ遷移に使えますが、 「通常のリンクを表示したいのか」 「処理の結果に応じて移動したいのか」によって 適した方法が異なります。
今回は、Linkとの違いを確認しながら、 push()replace()back()refresh()の役割を整理します。

Next.js useRouter Link ページ遷移 App Router 初心者向け
01

LinkがあるのになぜuseRouterを使うの?

Next.jsでは、通常のページリンクを作るときに Linkを使います。

Linkによるページ遷移
import Link from "next/link";

export default function Page() {
  return (
    <Link href="/blog">
      記事一覧を見る
    </Link>
  );
}

一方で、次のようなコードを見かけることもあります。

useRouter ボタンを押したときに移動
"use client";

import { useRouter } from "next/navigation";

export default function Button() {
  const router = useRouter();

  return (
    <button
      onClick={() => router.push("/blog")}
    >
      記事一覧を見る
    </button>
  );
}
?

どちらも/blogへ移動するなら同じでは?

移動先は同じですが、 ページ遷移を開始する方法が異なります。

Link リンクをクリックして移動

ページ内に移動先を示すリンクを 表示したい場合に使います。

useRouter() 処理から命令して移動

条件判定やフォーム送信後など、 JavaScriptの処理から移動します。

普通のリンクはLink、
処理の結果に応じた移動はuseRouter()と考えると 整理しやすくなります。

03

useRouter()とは?

useRouter()は、 Next.jsが提供するReactのフックです。

App Routerでは、 next/navigationから読み込みます。

ROUTER
REACT HOOK JavaScriptの処理からページ遷移を操作するフック

ボタン操作、フォーム送信、条件判定などをきっかけに ページを移動できます。

useRouter()から取得できるもの

ROUTER OBJECT routerを取得する
const router = useRouter();

ここで取得したrouterには、 ページ遷移を操作するためのメソッドが入っています。

push() 別ページへ移動
replace() 履歴を置き換えて移動
back() 前のページへ戻る
forward() 次のページへ進む
refresh() 現在のルートを更新
prefetch() 移動先を先に読み込む
04

useRouter()にはClient Componentが必要

App Routerのコンポーネントは、 特に指定しなければServer Componentとして扱われます。

しかし、useRouter()はブラウザー上の操作に反応するフックなので、 Client Component内で使用します。

STEP 1 ファイルの先頭に書く "use client";
STEP 2 useRouterを読み込む from "next/navigation"
CLIENT COMPONENT 基本構造
"use client";

import { useRouter } from "next/navigation";

export default function NavigationButton() {
  const router = useRouter();

  return (
    <button
      onClick={() => router.push("/blog")}
    >
      記事一覧を見る
    </button>
  );
}
書く位置に注意

"use client";は、 import文よりも前のファイル先頭へ書きます。

05

useRouter()の基本的な使い方

基本的な流れは4段階です。

01 Client Componentにする "use client";
02 useRouterをimport next/navigation
03 routerを取得 const router = useRouter();
04 メソッドを実行 router.push("/blog");
完成例
"use client";

import { useRouter } from "next/navigation";

export default function Button() {
  const router = useRouter();

  const handleClick = () => {
    router.push("/contact");
  };

  return (
    <button onClick={handleClick}>
      お問い合わせへ進む
    </button>
  );
}
useRouter() ルーターを取得
handleClick クリック後の処理
router.push() 移動を実行
onClick ボタンと処理を接続
07

router.push()で別ページへ移動する

router.push()は、 useRouter()で最もよく使うメソッドです。

PUSH
ROUTER METHOD 移動先をブラウザー履歴へ追加してページを移動する

移動後にブラウザーの戻る操作をすると、 元のページへ戻れます。

PUSH /blogへ移動する
router.push("/blog");

動的なURLへ移動する

記事IDをURLへ入れる
const articleId = "abc123";

router.push(`/blog/${articleId}`);
固定部分 /blog/
記事ID abc123
移動先 /blog/abc123

検索条件をURLへ入れる

クエリパラメータ付きURL
const keyword = "Next.js";

router.push(
  `/search?keyword=${encodeURIComponent(keyword)}`
);
08

router.replace()で履歴を置き換える

router.replace()も別ページへ移動しますが、 push()とはブラウザー履歴の扱いが異なります。

router.push()
ログイン
マイページ
履歴へ追加する

戻る操作でログイン画面へ戻れます。

router.replace()
ログインを置換
マイページ
現在の履歴を置き換える

戻る操作でログイン画面へ戻りにくくなります。

REPLACE 履歴を置き換えて移動
router.replace("/mypage");
戻れるようにしたい push()

一覧から詳細へ移動する場合など。

戻らせたくない replace()

ログイン後や完了画面への移動など。

09

back()とforward()で履歴を移動する

useRouter()では、 ブラウザーの戻る・進む操作に相当する処理も実行できます。

router.back() 前のページへ戻る
router.forward() 次のページへ進む
戻るボタン
"use client";

import { useRouter } from "next/navigation";

export default function BackButton() {
  const router = useRouter();

  return (
    <button onClick={() => router.back()}>
      前のページへ戻る
    </button>
  );
}
戻り先は固定ではない

back()は特定のURLへ移動するのではなく、 ユーザーのブラウザー履歴を1つ戻ります。 必ず記事一覧へ戻したい場合は、 Linkやpush()でURLを明示します。

10

router.refresh()とは?

router.refresh()は、 現在表示しているルートを更新するためのメソッドです。

ブラウザーでページ全体を再読み込みする操作とは異なり、 現在のルートについてサーバーから新しい内容を取得し、 必要な部分を更新します。

現在の画面 古い記事一覧
router.refresh() ルートを再取得
更新後 新しい記事一覧
REFRESH データ更新後に画面を更新
const handleUpdate = async () => {
  await updateArticle();

  router.refresh();
};
方法
主な動作
router.refresh()
現在のルートを再取得して表示を更新
window.location.reload()
ブラウザーのページ全体を再読み込み
11

router.prefetch()とは?

router.prefetch()は、 ユーザーが移動する可能性のあるルートを あらかじめ読み込むためのメソッドです。

現在 入力フォーム
移動前に読み込み
次の画面 確認ページ
移動先を先に読み込む
router.prefetch("/contact/confirm");

ただし、通常のLinkでは、 移動先のプリフェッチが組み込まれています。 そのため、一般的なナビゲーションのためだけに useRouter()とprefetch()を使う必要はありません。

Linkで表現できる移動はLinkへ任せ、
プログラム上の特別な制御が必要なときだけ useRouter()を使います。

12

フォーム送信後にページを移動する

useRouter()が特に役立つ例が、 フォーム送信後のページ遷移です。

01 フォーム入力
02 送信処理
03 送信成功を確認
04 完了ページへ移動
FORM 送信成功後に移動
"use client";

import { FormEvent } from "react";
import { useRouter } from "next/navigation";

export default function ContactForm() {
  const router = useRouter();

  const handleSubmit = async (
    event: FormEvent<HTMLFormElement>
  ) => {
    event.preventDefault();

    const response = await fetch("/api/contact", {
      method: "POST",
      body: new FormData(event.currentTarget),
    });

    if (response.ok) {
      router.push("/contact/complete");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        name="name"
        required
      />

      <button type="submit">
        送信する
      </button>
    </form>
  );
}
送信成功 完了ページへ移動 router.push()
送信失敗 現在の画面でエラー表示 setError()
13

microCMSを使ったサイトでの使用例

microCMSの記事一覧では、 記事カードそのものが通常のリンクであれば Linkを使うのが基本です。

記事カードはLinkを使う

記事一覧
import Link from "next/link";

export default function ArticleCard({
  article,
}: {
  article: {
    id: string;
    title: string;
  };
}) {
  return (
    <Link href={`/blog/${article.id}`}>
      <article>
        <h2>{article.title}</h2>
      </article>
    </Link>
  );
}

条件を確認してから移動する場合

useRouter 確認後に記事編集ページへ移動
"use client";

import { useRouter } from "next/navigation";

export default function EditButton({
  articleId,
}: {
  articleId: string;
}) {
  const router = useRouter();

  const handleClick = () => {
    const confirmed = window.confirm(
      "この記事を編集しますか?"
    );

    if (confirmed) {
      router.push(`/admin/blog/${articleId}/edit`);
    }
  };

  return (
    <button onClick={handleClick}>
      編集する
    </button>
  );
}
記事タイトルをクリック Link
確認後に編集画面へ移動 useRouter()
保存後に一覧を更新 refresh()
削除完了後に一覧へ移動 replace()
14

外部サイトへの移動には何を使う?

LinkやuseRouter()は、 主にNext.jsサイト内のルート移動に使います。

別のドメインにある外部サイトへ移動する場合は、 通常のaタグを使うのが基本です。

外部サイトを別タブで開く
<a
  href="https://example.com"
  target="_blank"
  rel="noopener noreferrer"
>
  外部サイトを見る
</a>
サイト内 Link /blog
処理後のサイト内移動 useRouter() router.push("/complete")
外部サイト aタグ https://example.com
15

外部から受け取ったURLをそのまま渡さない

router.push()やrouter.replace()へ渡すURLは、 信頼できる値だけを使用します。

フォーム入力やURLパラメータなど、 ユーザーが変更できる文字列を そのまま移動先として使うのは避けます。

避けたい例
router.push(userInput);

入力された値を無条件で使用する。

確認する例
const allowedPaths = [
  "/",
  "/blog",
  "/contact",
];

if (allowedPaths.includes(path)) {
  router.push(path);
}
移動先を限定する

サイト内で許可したパスだけを使う、 IDをURLへ組み立てる前に形式を確認するなど、 移動先を制御します。

16

よくあるつまずき

CHECK 01 use clientを書いていない
"use client";

import { useRouter } from "next/navigation";
CHECK 02 next/routerからimportしている
from "next/router" from "next/navigation"

appフォルダーを使うApp Routerでは、 next/navigationから読み込みます。

CHECK 03 useRouterを関数の外で実行している
export default function Button() {
  const router = useRouter();

  return (
    <button
      onClick={() => router.push("/blog")}
    >
      移動する
    </button>
  );
}
CHECK 04 クリック前にpush()が実行される
onClick={router.push("/blog")} onClick={() => router.push("/blog")}
CHECK 05 普通のリンクにもuseRouterを使っている
<Link href="/blog">
  記事一覧を見る
</Link>

移動先が最初から決まっている通常のリンクには、 Linkを使います。

CHECK 06 pushとreplaceの違いが分からない

戻る履歴を残すならpush()、 現在の履歴を置き換えるならreplace()です。

CHECK 07 back()の戻り先を固定だと思っている

back()の移動先は、 ユーザーがそのページへ来るまでの履歴によって変わります。

CHECK 08 refresh()で画面が変わらない

キャッシュやデータ更新処理の状態によっては、 refresh()を実行しても取得結果が変わらない場合があります。

17

まとめ:リンクと処理による移動を使い分ける

LinkとuseRouter()は、 どちらもNext.jsのページ遷移に使います。

ただし、通常のナビゲーションを表示するのか、 JavaScriptの処理から移動するのかによって 役割が異なります。

今回覚えておきたいこと

  • useRouter()は処理からページ遷移を操作するフック
  • App Routerではnext/navigationから読み込む
  • useRouter()はClient Component内で使う
  • 通常のリンクにはLinkを使う
  • router.push()は履歴を追加して移動する
  • router.replace()は履歴を置き換えて移動する
  • router.back()はブラウザー履歴を戻る
  • router.refresh()は現在のルートを更新する
  • router.prefetch()は移動先を先に読み込む
  • 外部サイトへの移動にはaタグを使う
  • 信頼できないURLをrouterへ渡さない
通常のリンク Link <Link href="/blog">
処理結果に応じた移動 useRouter() router.push("/blog")

最初は、LinkとuseRouter()のどちらを使っても 同じページへ移動できるため、 違いが分かりにくく感じました。

しかし、「リンクを表示したいのか」 「処理から移動を命令したいのか」で分けると、 使い分けはシンプルです。

Next.js・microCMS初心者の学習記録 通常の移動はLink、
処理と連動する移動はuseRouter()を使います。


AILPENGINE。自動進化型AI-LP。公開後も、成果に合わせて進化する! 行動計測、分析、構成改善、成果最大化。自前計測、CTA位置最適化、レポート可視化。LP改善を相談する(相談無料)。

日本ドラフトのAIチャットボットで問い合わせ対応を効率化・自動化!24時間365日対応、簡単設定、マルチプラットフォーム対応で人件費・工数を削減。今すぐ無料で相談する

※当社は、当サイトに掲載する情報について、正確性・完全性・有用性その他一切の事項を保証するものではありません。
また、当サイトの情報をご利用いただいたことにより生じた損害、ならびに当サイトからリンクまたはバナー等を通じて移動した外部サイトにおいて提供される情報・サービス等により生じた損害について、当社は一切の責任を負いかねます。