ミッション
レベル1–2のサイトを React で再構築。後退に聞こえる? 違う——最高のトレーニング:コンテンツとデザインはもう決まってるから、新しい技術だけに集中できる。終わったら、プロが価値を感じる理由が白黒はっきり。
再構築プラン
-
サイトをコンポーネントに分割。 紙と鉛筆を取る(マジで!)サイトを箱でスケッチ:Header、Gallery、Quiz、Footer… 各箱 =
src/の1ファイル。 -
HTML をコンポーネントに移す。 古い
.htmlから JSX に少しずつコピー。馴染みの違いに注意:class→className、各コンポーネントは1つのラッパー要素。画像を Vite プロジェクトのpublic/にコピー——/images/team.jpgみたいなパスはそのまま動く。 -
CSS を移す。
style.cssの中身をsrc/App.cssにコピー。ほぼそのまま動く——CSS は CSS。 -
データを配列に出す。 カード、結果、ギャラリー写真——繰り返すものは全部オブジェクトの配列 +
.map()、コンポーネントレッスンで学んだ通り。 -
レベル2の呪文を state に書き換え。 変換表:
レベル2(素の JavaScript) React getElementById+textContentstate + JSX の {value}addEventListener("click", ...)onClick={...}classList.toggle+ CSS.hidden真偽値 state + {condition && (...)}変数付きカウンター 数値の useState
見てみよう:React 流ダークモード
1つの呪文を一緒に書き換えて、変換を見る:
import { useState } from 'react';
import Header from './Header.jsx';
import Gallery from './Gallery.jsx';
function App() {
const [dark, setDark] = useState(
localStorage.getItem("mode") === "dark"
);
function toggleMode() {
const newMode = !dark;
setDark(newMode);
localStorage.setItem("mode", newMode ? "dark" : "light");
}
return (
<div className={dark ? "dark" : ""}>
<Header onToggle={toggleMode} dark={dark} />
<Gallery />
</div>
);
}
export default App;
Header.jsx ではボタンが prop で関数を受け取る:
function Header({ onToggle, dark }) {
return (
<header>
<h1>My website</h1>
<button onClick={onToggle}>{dark ? "☀️" : "🌙"}</button>
</header>
);
}
最後の新しいこと:prop は関数も渡せる。 App が state を持ち、子に切り替えボタンを貸す。「state は上に住む」——React で最も一般的なパターン。
再構築チェックリスト
- サイトが少なくとも4コンポーネントに別ファイルで分割
- 繰り返し要素(カード、写真…)が配列 +
.map()から生成 - 少なくとも2つのインタラクティブ箇所が
useStateで動く - ダークモードが動き、記憶される(localStorage)
- コンソールにエラーなし
- コードに
getElementByIdがどこにもない 😉
行き詰まりはゲームの一部。 このレッスンはマラソン、スプリントじゃない——何日かに分けてOK。詰まったら:コンソール(F12)、Vite のエラーメッセージ、前レッスンの例と比較。プロもこうデバッグする。
確認: サイトが localhost で動き、(ほぼ)以前と同じ見た目——でも中身はコンポーネント、データ、state。データ配列にカードを1つ足して、どれだけ楽か見て。それ が React が存在する理由全部。
このレッスンのまとめ
- 再構築:コンポーネント分割 → HTML と CSS 移行 → データを配列 → 呪文を state に。
- prop は関数も渡せる——親が子に自分の state を制御するボタンを貸す。
- 同じ結果、きれいな構造:コピー減、変更楽。目に見える進歩。
© 2026 Ing. Martin Polak / AlgoRhino · コンテンツ利用規約