R初めてのReact

Day 2state と イベント — 動くUIの心臓部

イベント処理 — onClick と onChange

クリックや入力に反応する書き方を学ぶ。イベントには「関数そのもの」を渡すという最重要ポイントを、よくある間違いと一緒に押さえる。

イベント=「ユーザーの操作」に反応する

ボタンをクリックした、入力欄に文字を打った、といったユーザーの操作をイベントと呼びます。Reactでは、こうした操作に「そのとき動かしたい関数」を結びつけます。もっともよく使うのがクリックのonClickと、入力変化のonChangeです。玄関の呼び鈴にたとえると、onClickは「押されたら鳴らす仕掛けをセットしておく」ことに当たります。

TSX
const [count, setCount] = useState(0);
return (
  <button onClick={() => setCount(count + 1)}>
    {count} 回クリックされました
  </button>
);
onClickにアロー関数を渡す。クリックされた瞬間に中身が動く

最重要:渡すのは「関数」であって「呼び出した結果」ではない

ここがイベントで一番つまずくところです。onClickには「クリックされたら実行してね」という関数そのものを渡します。Reactが預かっておいて、クリックされた瞬間に呼び出してくれます。呼び出しは「あなた」ではなく「React」がやる、という感覚が大事です。

TSX
function handleClick() {
  setCount(count + 1);
}

// 書き方1:名前の付いた関数を「そのまま」渡す
<button onClick={handleClick}>+1</button>

// 書き方2:その場でアロー関数を作って渡す(引数を渡したいとき便利)
<button onClick={() => setCount(count + 1)}>+1</button>
関数を渡す2つの正しい書き方

onClick={handleClick} と onClick={handleClick()} の違い

onClick={handleClick} はhandleClickという関数を「渡す」ので、クリックしたときに動きます。一方 onClick={handleClick()} はかっこが付いていて、画面を組み立てた瞬間にhandleClickを「実行」してしまい、その戻り値を渡すことになります。結果、クリック前に一度動いてしまったり、無限ループになったりします。イベントには「かっこを付けずに関数名だけ」渡すのが基本です。

() を付けて渡す:描画時に実行されてしまう

handleClick() はクリック前に呼び出される

TSX
<button onClick={handleClick()}>+1</button>

関数そのものを渡す:クリック時に実行される

handleClick はクリックされたときだけ動く

TSX
<button onClick={handleClick}>+1</button>

onChange:入力の変化を受け取る

入力欄(input)では、文字が変わるたびにonChangeが呼ばれます。渡した関数はイベント情報(e)を受け取り、e.target.valueで「今入力欄に入っている文字」を取り出せます。それをstateに入れれば、入力とstateが常に同期します。

TSX
const [name, setName] = useState("");
return (
  <input
    value={name}
    onChange={(e) => setName(e.target.value)}
    placeholder="名前を入力"
  />
);
onChangeで入力値をstateに反映する

AIにはこう聞く

「このボタンのonClickに関数を渡す形に直して。onClick={fn()} と onClick={fn} の違いも説明して」と聞くと、正しい渡し方に直したうえで、なぜかっこを外すのかまで教えてくれます。onChangeで「入力値をstateに入れる書き方」を頼むのも定番です。

  • onClickはクリック、onChangeは入力変化に反応する
  • イベントには「関数そのもの」を渡す(呼び出した結果ではない)
  • onClick={fn} は正しい、onClick={fn()} は描画時に実行されてしまう
  • 引数を渡したいときは () => fn(引数) のようにアロー関数で包む

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

onClick={handleClick} と onClick={handleClick()} の違いとして正しいものはどれ?

Q2

onChangeで、入力欄に今入っている文字を取り出すにはどれを使う?

Q3

「イベントには関数そのものを渡す(呼び出した結果ではない)」とはどういうことか、自分の言葉で説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。