2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Reactのフォームにおける value とは?

2
Posted at

value<input> に設定する理由は、「画面上の表示」と「Reactが持っているデータ(状態:State)」を完全に一致させるためです。

通常のHTML(JavaScriptを使わない世界)では、入力欄に文字を打ち込むと、ブラウザが自動的にその文字を画面に表示します。しかし、Reactでは「画面の表示」と「Reactが持っているデータ(State)」を完全に一致させたいというルールがあります。

Reactの世界では、これを「制御コンポーネント(Controlled Component)」と呼びます。

value を設定する意味

1. ReactのStateが「唯一の正しいデータ源」になる

value={amount} と書くことで、「この入力欄の中身は、常に amount というStateの値そのものですよ」と強制することができます。

入力欄の表示の主導権を、ブラウザからReact側へと奪い取るイメージです。

2. 「データの変更」と「画面の更新」が連動する

コード内にある以下のセットで、双方向の連動が完成します。

// ① Stateの値を画面に映す
value={amount}
// ② キーボード入力されたらStateを更新する
onChange={(e) => setAmount(e.target.value)}
  • あなたが「1」とキーボードで叩く。
  • onChange が発火し、setAmount("1") が実行されてStateが変わる。
  • Stateが変わったのでReactが再描画(リレンダリング)され、value={amount}(つまり1)が画面に表示される。

この一連の流れが超高速で行われています。

もし value を設定しなかったらどうなる?

<input 
  type="number" 
  onChange={(e) => setAmount(e.target.value)} 
/>

これでも一見、キーボードで入力した文字が画面に見えるし、onChange でStateに値は保存されます。しかし、「画面の表示」と「Reactのデータ」がバラバラの独立した状態になってしまいます。

これによって、以下のような実務でよくある実装ができなくなります

できないこと例①:送信した後に、入力欄を空っぽ(リセット)にできない

送金ボタンを押した後に入力欄を「0」や「空っぽ」に戻したいとき、value がないと、React側から画面を操作できません。

const handleSubmit = async (e) => {
  e.preventDefault();
  await fetch(...);
  
  setAmount('');
  // value={amount} があれば画面も空になるが、無いと画面は数字が残ったままになる
};

できないこと例②:初期値を外から入れられない

「前回保存した金額」や「URLのパラメータから取得した金額」を、ページを開いた瞬間に最初から入力欄に入れておきたい(初期値の設定)と思っても、value が紐づいていないと画面に反映されません。

📌 まとめ

  • value を設定しない場合: 入力欄はブラウザが勝手に管理している(Reactはそれを横から覗き見ているだけ)。
  • value を設定する場合: 入力欄はReactが100%管理している(データの変更、リセット、初期化が自由自在)。

実務のReact開発では、フォームの値を送信したりクリアしたりする制御が必須になるため、特別な理由がない限りは必ず valueonChange をセットで設定します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?