TOOLS BOX/ガイド/router.refresh()
API / Option

router.refresh()

現在の URL のまま Server Component を再フェッチし、サーバー側の最新状態を UI に反映させるメソッド。ページ遷移は行わない。

nextjsrouterrefreshserver-componentclient-componentnavigation
所属:next/navigation

代表的な値 / 使い方

  • router.refresh()
  • router.push('/dashboard'); router.refresh()
  • router.replace('/dashboard'); router.refresh()

注意点 / Pitfalls

  • ·router.push() / router.replace() の直後に呼ばないと、Cookie を使う Server Component が古いデータを返し続けることがある
  • ·Client state(useState / useReducer の値)はリセットされない。Server Component のデータのみ再フェッチする
  • ·URL の変更は行わない。遷移も伴わない。ナビゲーション目的では使えない
  • ·乱用するとサーバーへの余分なリクエストが増えるため、状態変化が確実なタイミングでのみ呼ぶ

補足

ログイン・ログアウト後など Cookie が変わった場面で、Server Component が古い認証状態のままになるのを防ぐために使う。router.push() / router.replace() はクライアントサイドナビゲーションを行うが、サーバーキャッシュは自動では更新しない。refresh() はその差を埋める手段。

何をする API か

router.refresh()URL を変えずに、現在のルートの Server Component を再フェッチ します。ページ遷移は行いません。

router.push() / router.replace()router.refresh()
URL変わる変わらない
ページ遷移するしない
Server Component の再フェッチ自動では行わない行う
Client state(useState など)保持される保持される

なぜ push / replace の後に必要になるか

router.push()router.replace() はクライアントサイドナビゲーションのため、Next.js のサーバーキャッシュを自動では更新しません。

たとえばログイン後に Cookie が発行されても、Server Component は古いキャッシュを返し続けることがあります。router.refresh() を合わせて呼ぶことで、Server Component が最新の Cookie を読み込んだ状態で再レンダリングされます。

"use client";
import { useRouter } from "next/navigation";

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

  async function handleSubmit(e: React.FormEvent) {
    e.preventDefault();
    const res = await fetch("/api/login", { method: "POST", ... });
    if (res.ok) {
      router.replace("/dashboard"); // ページ遷移
      router.refresh();             // Server Component を再フェッチして Cookie を反映
    }
  }
  return <form onSubmit={handleSubmit}>...</form>;
}

遷移なしで状態だけ更新したい場合

ページを移動せずに Server Component のデータだけ更新したい場合にも使えます。

"use client";
import { useRouter } from "next/navigation";

export function LikeButton({ postId }: { postId: string }) {
  const router = useRouter();

  async function handleLike() {
    await fetch(`/api/posts/${postId}/like`, { method: "POST" });
    router.refresh(); // 同じページのまま Server Component を再フェッチ
  }

  return <button onClick={handleLike}>いいね</button>;
}

よくある誤解

Client state はリセットされない

router.refresh() は Server Component のデータを再フェッチするだけで、useStateuseReducer の値はリセットされません。

// useState の count は refresh() を呼んでもリセットされない
const [count, setCount] = useState(0);
router.refresh(); // count は変わらない

完全なページリロードが必要な場合は window.location.reload() を使いますが、通常は router.refresh() で十分です。

URL は変わらない

router.refresh() はナビゲーション API ではありません。URL を変えたい場合は router.push() / router.replace() を使います。

// ❌ URL を変える目的では使えない
router.refresh(); // URL は変わらない

// ✅ URL を変えるなら push / replace
router.push("/new-page");

向いている場面

  • ログイン・ログアウト後に Cookie の変化を Server Component に反映させたい
  • フォーム送信後に同じページのリストを最新状態に更新したい
  • 状態変更 API を呼んだ後に UI を再同期させたい(ただし遷移はしたくない)

router.push() / router.replace() / redirect() の使い分けは → router.push() vs router.replace() vs redirect()

関連ドキュメント

関連サンプル

同じテーマや技術スタックを使った実装例