← inaro.devAI駆動開発 学習ツール
中級

loading / error / not-found

なぜ学ぶか: Reactのフェーズで「4状態(読み込み中・エラー・空・正常)」を学びました。Next.jsはそのうち2つを、ファイルを置くだけで実現できます。例を見てください。

まずはこの例を見てみましょう

// app/posts/loading.tsx — ページの準備中、自動で表示される
export default function Loading() {
  return <p>読み込み中…</p>;
}

// app/posts/error.tsx — エラーが起きたら自動で表示される
"use client"; // 再試行ボタンがあるのでブラウザ行き
export default function ErrorPage({ unstable_retry }: { unstable_retry: () => void }) {
  return (
    <div>
      <p>読み込めませんでした。</p>
      <button onClick={() => unstable_retry()}>再試行</button>
    </div>
  );
}

page.tsxと同じフォルダに「置くだけ」。importも呼び出しも不要で、自動で使われます。

loading.tsx=読み込み中の画面

同じフォルダのpage.tsxがデータ取得中のあいだ、自動で表示されます。

error.tsx=エラー時の画面

ページ内でエラーが起きると表示されます。例のとおり、再試行ボタンがあるので'use client'が必要です。再試行(データの取り直し)はunstable_retryで行います。unstable_は「名前が今後変わるかも」という印で、現時点の公式の書き方です。

not-found.tsx=404画面

存在しないURLなどで表示される「見つからない」の受け皿です。

レビュー観点

この3ファイルの有無を見るだけで、正常系以外への配慮が分かります。「loadingとerrorも作って」は定番の追加指示です。

コード例

// ===== app/posts/loading.tsx(データ取得中に自動表示)=====
export default function Loading() {
  return <p>読み込み中…</p>;
}

// ===== app/posts/error.tsx(エラー時に自動表示・'use client' 必須)=====
"use client";
export default function ErrorPage({ unstable_retry }: { unstable_retry: () => void }) {
  return (
    <div>
      <p>読み込めませんでした。</p>
      <button onClick={() => unstable_retry()}>再試行</button>
    </div>
  );
}

手書きで4状態の分岐を書く代わりに、Next.jsはファイルを置くだけで肩代わりしてくれます。AIは古い書き方(resetを再試行ボタンにする)で生成しがちですが、resetはデータを取り直さずに描き直すだけ。取り直して再試行するのはunstable_retryです。

ステップ 1 / 2

※ カリキュラムの内容はAIが生成しており、誤りが含まれる場合があります。正確な情報は公式ドキュメント等でご確認ください。