Reactで複数のフォーム入力をまとめて管理する方法!初心者でもわかるState活用入門
生徒
「Reactで名前やメールアドレスなど、たくさん入力欄があるときは全部別々に管理するんですか?」
先生
「実は、複数の入力欄を一つのStateでまとめて管理する方法があります。」
生徒
「一つの箱で全部管理できるんですか?」
先生
「はい。申込書を一冊のファイルにまとめるような感覚で扱えます。順番に見ていきましょう。」
1. フォーム入力が増えると何が大変か
フォームとは、名前やメールアドレス、年齢などを入力する画面のことです。 入力欄が一つだけなら管理は簡単ですが、 入力欄が増えるたびにStateを増やすと、コードが長くなり見づらくなります。 まるで、メモ帳が何冊も机に散らばっているような状態です。 そこで、複数の入力を一つにまとめる考え方が役立ちます。
2. 1つのStateでまとめて管理する考え方
複数の入力を一つのStateで管理するときは、 オブジェクトという仕組みを使います。 オブジェクトとは、名前と内容をセットで管理できる箱の集まりです。 「名前はこれ」「メールはこれ」というように、 一冊のノートに項目ごとに書くイメージです。
3. 最もシンプルな基本例
まずは、名前とメールアドレスを一つのStateで管理する例を見てみましょう。 最初に空の入力欄を用意し、入力された内容をまとめて保存します。
import React, { useState } from "react";
function App() {
const [form, setForm] = useState({
name: "",
email: ""
});
return (
<div>
<input
type="text"
placeholder="名前"
onChange={(e) => setForm({ ...form, name: e.target.value })}
/>
<input
type="email"
placeholder="メール"
onChange={(e) => setForm({ ...form, email: e.target.value })}
/>
</div>
);
}
export default App;
4. spread構文の意味をやさしく理解する
コードに出てくる三つの点は、spread構文と呼ばれます。 これは「今ある内容を一度全部コピーする」という意味です。 申込書に新しい項目を書き足すとき、 すでに書いた内容を消さずに追加するのと同じです。 これを使わないと、他の入力内容が消えてしまうので注意が必要です。
5. 入力欄が増えた場合の管理方法
入力欄が増えても、同じStateに項目を追加するだけで対応できます。 電話番号や年齢などを追加しても、 管理する箱は一つのままです。
import React, { useState } from "react";
function App() {
const [form, setForm] = useState({
name: "",
email: "",
age: ""
});
return (
<div>
<input
type="text"
placeholder="名前"
onChange={(e) => setForm({ ...form, name: e.target.value })}
/>
<input
type="email"
placeholder="メール"
onChange={(e) => setForm({ ...form, email: e.target.value })}
/>
<input
type="number"
placeholder="年齢"
onChange={(e) => setForm({ ...form, age: e.target.value })}
/>
</div>
);
}
export default App;
6. name属性を使ってコードを短くする
入力欄が多くなると、同じような処理を何度も書くことになります。 そこで、name属性を使う方法があります。 これは、入力欄に名前札を付けて、 どの項目が変更されたかを自動で判断する仕組みです。
import React, { useState } from "react";
function App() {
const [form, setForm] = useState({
name: "",
email: "",
age: ""
});
const handleChange = (e) => {
setForm({ ...form, [e.target.name]: e.target.value });
};
return (
<div>
<input name="name" placeholder="名前" onChange={handleChange} />
<input name="email" placeholder="メール" onChange={handleChange} />
<input name="age" placeholder="年齢" onChange={handleChange} />
</div>
);
}
export default App;
7. 初心者がつまずきやすい注意点
よくある失敗は、Stateの中身を直接書き換えてしまうことです。 Reactでは、新しい内容を作って入れ替える必要があります。 また、spread構文を忘れると、 他の入力内容が消えてしまう原因になります。 「一つのStateでまとめるときは、必ず全体をコピーする」 という意識を持つと安心です。
8. 複数管理のメリット
複数のフォーム入力を一つのStateで管理すると、 コードが整理され、後から見ても分かりやすくなります。 入力内容をまとめて送信したり確認したりするのも簡単です。 これは、書類を一つのファイルにまとめて保管するのと同じで、 実際の開発でもよく使われる方法です。