この課題のねらい
ここはいよいよ「全部つなげて、自分のアプリを最後まで作り切る」フェーズです。
やることはシンプルで強いです。
実装を最後までやり切る
出てきたバグを自分で直す
余力で UI を少しだけ“気持ちよく”する
ここまでやると、「チュートリアルをなぞった人」から「自分のプロダクトを作った人」に一段ステージが上がります。
必須課題① 実装完了まで持っていく
設計書どおりにまずは「動くもの」を作る
前の「最終アプリ設計」で、仕様・ページ一覧・ワイヤーフレームを書きましたよね。
最初にやるべきことは、「その設計書どおりに、とにかく一通り動くものを作る」です。
たとえば学習ログアプリなら、こういう流れになります。
トップページ / を作る
フォームでログを追加できるようにする
追加したログが一覧に表示されるようにする
詳細ページ /logs/[id] に遷移できるようにする
詳細ページでそのログの内容が見られるようにする
この段階では、「見た目がダサい」「コードがちょっと雑」でもいいです。
最優先は「仕様で書いたことが一通りできる状態」まで持っていくこと。
「あとで直すメモ」を残しながら進める
実装していると、「ここもうちょっときれいに書けそう」「この UI ちょっと微妙だな」と思うところが必ず出てきます。
でも、そのたびに立ち止まるとゴールにたどり着けません。
そういうときは、コメントでメモを残して先に進みましょう。
// TODO: このあたりの条件分岐はあとで整理する
// TODO: ボタンの見た目を整える
TSX「一旦動くものを完成させてから、あとで整える」というリズムを覚えると、
最後まで走り切る力がつきます。
必須課題② バグ修正をやり切る
「バグが出るのは当たり前」と思っておく
最終アプリの実装では、ほぼ確実にバグが出ます。
画面が真っ白になる
クリックしても何も起きない
意図しないデータが表示される
ここで大事なのは、「あ、ちゃんとバグ出た。ここからが本番だな」と思えるかどうかです。
バグは「失敗」じゃなくて、「デバッグ練習の教材」です。
バグ修正の基本の流れ
バグを見つけたら、次の順番で進めてみてください。
どの操作で、毎回再現できるかをはっきりさせる
エラーメッセージ(画面 or コンソール)を読む
どのコンポーネント・どの関数が怪しいかを絞る
その部分のコードをじっくり読む(必要なら console.log も使う)
原因が分かったら、最小限の修正を入れて、もう一度同じ操作で再確認する
たとえば、「ログを追加したのに一覧に反映されない」というバグなら、
フォームの onSubmit がちゃんと呼ばれているか
親コンポーネントの追加ハンドラが呼ばれているか
setState の書き方が正しいか(配列を上書きしていないか)
一覧に渡している props が正しいか
このあたりを順番に疑っていきます。
「1つのバグから学びを抜き取る」
バグを直したら、「なぜこのバグが起きたのか」を一言で言語化してみてください。
props の渡し忘れだった
state を直接書き換えていた
非同期処理の完了前に画面を描画していた
こうやってラベルをつけておくと、次に似たバグに出会ったときに、
「これ、あのときのパターンっぽいな」と気づけるようになります。
挑戦課題 UI改善で「プロダクト感」を一段上げる
いきなり全部きれいにしなくていい
UI 改善と聞くと、「デザインセンスないし…」と構えがちですが、
最初にやるべきことは、センスではなく「情報の整理」です。
余白をそろえる
見出しと本文の文字サイズにメリハリをつける
ボタンの位置とスタイルをそろえる
これだけでも、かなり「ちゃんとしたアプリ」に見えてきます。
学習ログアプリの UI 改善の例
たとえばトップページを、こんな感じで少し整えてみます。
ヘッダーに薄いボーダーと背景色をつける
メインコンテンツを白いカード風にする
フォームと一覧の間に見出しを入れる
コードでいうと、こんなイメージです。
export default function LearningLogPage() {
return (
<main
style={{
minHeight: "100vh",
backgroundColor: "#f3f4f6",
fontFamily: "system-ui, sans-serif",
}}
>
<header
style={{
padding: "12px 24px",
borderBottom: "1px solid #e5e7eb",
backgroundColor: "white",
fontWeight: 600,
}}
>
学習ログアプリ
</header>
<div
style={{
maxWidth: "960px",
margin: "24px auto",
padding: "20px 16px 32px",
backgroundColor: "white",
borderRadius: "12px",
boxShadow: "0 10px 15px rgba(15, 23, 42, 0.08)",
border: "1px solid #e5e7eb",
}}
>
<h1 style={{ fontSize: "22px", marginBottom: "12px" }}>
今日の学習を記録する
</h1>
{/* フォーム */}
{/* ... */}
<h2 style={{ fontSize: "18px", marginTop: "24px", marginBottom: "8px" }}>
学習ログ一覧
</h2>
{/* 一覧 */}
{/* ... */}
</div>
</main>
);
}
TSXここでやっていることは派手なデザインではなく、
背景とカードで「層」を作る
見出しで「ここからここまでが何のブロックか」を示す
余白と影で「まとまり感」を出す
という、情報整理に近いものです。
UX 的な改善も「UI改善」の一部
UI 改善は見た目だけではありません。
使い心地(UX)も含めて良くしていくことです。
追加ボタンを押したあと、入力欄をクリアする
削除時に「本当に削除しますか?」の確認を出す(必要なら)
ローディング中は「読み込み中…」を表示する
エラー時は赤文字でメッセージを出す
こういう「ちょっとした気配り」も、立派な UI/UX 改善です。
まとめ:最終アプリ実装でつかんでほしいこと
この仕上げの課題で、本当に持ち帰ってほしいのは次の感覚です。
設計どおりに「まずは一通り動くもの」を作り切る力
バグが出ても折れずに、「再現 → 読む → 絞る →直す」を回せる力
最後に UI/UX を一段だけ整えて、「自分のプロダクト」と胸を張れる状態にする感覚
ここまでやり切ったら、もう「Next.js × React 入門を終えた人」ではなく、
「Next.js × React で自分のアプリを一つ作り切った人」です。
