コース一覧
Reactで状態・フォーム・リストを扱う
なぜstateが必要か

Reactで状態・フォーム・リストを扱う

useState、イベントハンドラ、制御されたinput、フォーム送信とバリデーション、mapによるリスト表示、key、条件レンダリング、空状態を扱う全25レッスンのコースです。入力・絞り込み・ダークモードへ反応する作品ギャラリーを作り、ユーザー操作で変化するUIの基本を身につけます。

1
state(useState)
01. なぜstateが必要か15分
02. useState15分
03. ボタンで更新15分
04. 複数のstate15分
05. オブジェクトのstate15分
06. 配列のstate15分
07. 再レンダリングの仕組み10分
08. つくる - ダークモード切替20分
09. 第4章クイズ15分
2
イベントとフォーム
01. イベントハンドラ15分
02. イベントオブジェクト15分
03. 制御されたinput15分
04. 複数の入力15分
05. フォーム送信15分
06. バリデーション15分
07. つくる - 問い合わせフォーム20分
08. 第5章クイズ15分
3
リストと条件レンダリング
01. mapでリスト描画15分
02. key15分
03. 条件レンダリング(&&)15分
04. 出し分け(三項)15分
05. 空状態15分
06. 絞り込みUI15分
07. つくる - ギャラリーReact版20分
08. 第6章クイズ15分

なぜstateが必要か

画面を変えるには state が要る

画面が変わるとはどういうことか

ここまで作ってきたプロフィールサイトは、一度描いたら変わらない画面でした。ここからは「押したら数字が増える」「押したら色が変わる」ような、動く画面を作っていきます。

そのために最初に知っておきたいのは、普通の変数を書きかえても画面は変わらないという React のルールです。

動かない例を先に見る

いいねの数を表示して、ボタンを押したら 1 増やすつもりのコードです。

JavaScript (JSX)

export default function App() { let likes = 0; function handleClick() { likes = likes + 1; console.log(likes); } return ( <div> <p>いいね {likes}</p> <button onClick={handleClick}>いいね</button> </div> ); }

これを実行してボタンを押すと、コンソールには 1、2、3 と出ます。変数はちゃんと増えています。それなのに画面の「いいね 0」は 0 のままです。

なぜ変わらないのか

理由は 2 つあります。

1 つめは、React が画面を描き直すのは コンポーネント関数をもう一度呼んだとき だけだからです。likes を書きかえても、React には「画面を作り直して」という合図が届きません。だから前に描いた <p>いいね 0</p> がそのまま残ります。

2 つめは、仮に何かのきっかけで App がもう一度呼ばれたとしても、let likes = 0; の行を最初から実行し直すので、増やした値は消えて 0 に戻ってしまうことです。

つまり普通の変数は「画面に知らせる力」も「次の呼び出しまで値を覚えておく力」も持っていません。

state が両方を引き受ける

この 2 つをまとめて解決するのが state です。state は React が預かってくれる値で、次の性質を持ちます。

  • 更新関数で変えると、React が「変わった」と気づいてコンポーネントを呼び直す
  • コンポーネントが呼び直されても、値は前の続きから始まる

書き方は useState を使います。詳しい説明は次のレッスンでしますが、形だけ先に見ておきます。

JavaScript (JSX)

import { useState } from "react"; export default function App() { const [likes, setLikes] = useState(0); return ( <div> <p>いいね {likes}</p> <button onClick={() => setLikes(likes + 1)}>いいね</button> </div> ); }

likes = likes + 1 が setLikes(likes + 1) になっただけに見えますが、この違いが「画面が動くかどうか」を分けています。

つまずきどころ

コンソールに正しい数が出ていると「動いている」と思いこみがちです。動いているのは変数だけで、画面はまったく別だと切り離して考えてください。React では 画面に出したい値は必ず state にする と覚えておくと迷いません。

演習

動かないいいねボタンを、state を使って動くように直します。

ヒント

const [likes, setLikes] = useState(0) の形で宣言します

クリックしたときの処理は setLikes(likes + 1) です。likes に直接代入してはいけません

App.jsx
プレビュー

できているか

  • はじめは「いいね 0」と表示されている
  • ボタンを 1 回押すと「いいね 1」になる
  • そこからさらに 2 回押すと「いいね 3」になる
エディタを読み込んでいます