コース一覧
React道場 ハレノヒ珈琲をモダン化する10問
ダークモード切替(React版)

React道場 ハレノヒ珈琲をモダン化する10問

React の基本を終えた人が、白紙から部品を組み立てる演習専用コースです。解説はありません。依頼と完成条件だけを読み、自分で設計します。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。props を受ける部品から始まり、state、条件付きのクラス、map での描画、絞り込み、制御コンポーネント、入力の検証を経て、最後は部品の分割と注文ウィジェットの完成まで、10問で React の主要な考え方を一巡します。1問15分から45分、全10問で約5時間です。React入門を終えて「写経はできるが白紙からは書けない」と感じている方に向いています。

1
初段
01. MenuCard部品を作れ15分
02. いいねボタン15分
03. ダークモード切替(React版)20分
04. メニュー一覧をmapで描画せよ20分
2
中段
01. カテゴリタブで絞り込め25分
02. 予約フォームを制御せよ25分
03. 入力エラーを表示せよ30分
04. 営業中バッジと時計30分
3
師範
01. 肥大部品を分割せよ35分
02. 総合 注文ウィジェット完成45分

ダークモード切替(React版)

初段 / 目安 20分

陽葵さんが夜のカウンターから顔を上げます。「JS 版の夜モード、リニューアル後も残して! でも classList を触るんじゃなくて、React 流でね」。

JS 道場では、ボタンが押されるたびに要素を探し出して classList.toggle でクラスを付け外ししていました。React ではその手つきを使いません。触るのは state だけで、クラスが付くか付かないかは 今の state から毎回決め直す 形にします。

持つのは真偽値の state を1つです。const [dark, setDark] = useState(false); と書けば、dark が今の夜モードの状態になります。あとは一番外側の要素の className を、dark から組み立てるだけです。三項演算子を使って className={dark ? "wrap dark" : "wrap"} のように書くと、state が変わった瞬間にクラスの有無が付いてきます。

切り替えるボタンは、今の値をひっくり返した値を更新関数に渡します。setDark(!dark) です。dark = !dark と直接代入しても画面は動きません。

これが React の言う「宣言的」の入口です。DOM を直接いじって手順を並べるのではなく、状態と見た目の対応を一度書いておけば、状態が変わったときの見た目は React が引き受けてくれます。

完成条件

  • 夜モードかどうかを真偽値の useState で持つ
  • 一番外側の要素は常に wrap クラスを持ち、夜モードのときだけ dark クラスも付く
  • 最初は夜モードではない
  • className="mode-btn" のボタンを押すたびに、夜モードと昼モードが入れ替わる

進め方

CSS 側には .wrap.dark の見た目が仕込んであります。クラスが付いた瞬間に背景と文字色が入れ替わるので、動いていれば見た目ですぐ分かります。

三項演算子は 条件 ? 真のときの値 : 偽のときの値 の形です。JSX の属性に埋めるので、波かっこの中に書きます。文字列をつなぐ書き方でも構いませんが、wrap を落とさないよう気をつけてください。wrap が消えると幅も余白も一緒に消えます。

押しても何も起きないときは、更新関数を呼んでいるか、渡している値がひっくり返っているかを確かめてください。setDark(dark) では今と同じ値を渡しているので、何も変わりません。

ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 クラスを付け外しする手順を書くのではなく、「今が夜モードかどうか」だけを state に持ちます。className はその state から毎回組み立て直すので、state が変わればクラスは自然に従います。

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
App.jsx
styles.css
プレビュー

できているか

  • 開いた直後はまだ夜モードではない
  • ボタンを1回押すと夜モードになる
  • もう1回押すと昼モードに戻る
エディタを読み込んでいます