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が生成しており、誤りが含まれる場合があります。正確な情報は公式ドキュメント等でご確認ください。