Reactで学ぶ型安全なフォーム入力のState管理!初心者でも安心して作れる入力フォーム
生徒
「Reactでフォームを作るとき、入力した文字をどうやって管理するんですか?」
先生
「フォームの入力内容はStateで管理します。TypeScriptを使えば、文字や数値の間違いも防げます。」
生徒
「入力欄が増えると、Stateも増えて混乱しそうです…」
先生
「型を使ってまとめて管理すると、フォームが増えても安全で分かりやすくなります。一緒に確認しましょう。」
1. フォーム入力とStateの基本関係
Reactでフォームを作るとき、入力された文字や選択された値は、そのままでは保存されません。そこで使うのがStateです。
Stateは「画面の中で変わる情報を覚えておく箱」です。入力フォームでは、「今、何が入力されているか」をStateに入れて管理します。
たとえば、名前入力欄がある場合、「名前」というStateを作り、キーボードで文字を打つたびにそのStateを更新します。これを制御されたコンポーネントと呼びます。
2. なぜ型安全なフォーム管理が必要なのか
JavaScriptだけでもフォームは作れますが、文字と数値が混ざったり、想定外の値が入ったりしやすくなります。
TypeScriptを使うと、「この入力欄は文字だけ」「この入力は数値」といったルールを型で決められます。これが型安全という考え方です。
型安全なフォーム管理をすると、次のようなメリットがあります。
- 間違った型の入力処理にすぐ気づける
- フォームが増えても管理しやすい
- 後から修正するときに安心できる
3. 文字入力フォームを型安全に管理する
まずは一番よく使う「文字入力」のフォームを見てみます。名前入力欄をStateで管理する基本形です。
import React, { useState } from "react";
function App() {
const [name, setName] = useState<string>("");
return (
<div>
<p>名前:{name}</p>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
);
}
export default App;
ここではStateの型をstringにしています。これにより、「nameには文字しか入らない」というルールがはっきりします。
4. 数値入力フォームのState管理
年齢や個数など、数値を入力するフォームもよくあります。ただし、HTMLの入力欄から取得できる値は、基本的に文字です。
そのため、Stateの型はnumberにし、必要に応じて変換するのがポイントです。
import React, { useState } from "react";
function App() {
const [age, setAge] = useState<number>(0);
return (
<div>
<p>年齢:{age}</p>
<input
type="number"
value={age}
onChange={(e) => setAge(Number(e.target.value))}
/>
</div>
);
}
export default App;
このようにStateの型をnumberにしておくと、文字が入るミスを防ぎやすくなります。
5. 複数の入力欄をまとめて管理する
フォームが増えると、Stateもたくさん必要になります。そこで便利なのが、オブジェクト型のStateです。
入力フォーム全体を1つのオブジェクトとして管理すると、整理しやすくなります。
type FormState = {
name: string;
age: number;
};
function App() {
const [form, setForm] = useState<FormState>({
name: "",
age: 0
});
return (
<div>
<p>名前:{form.name}</p>
<p>年齢:{form.age}</p>
<input
type="text"
value={form.name}
onChange={(e) =>
setForm({ ...form, name: e.target.value })
}
/>
<input
type="number"
value={form.age}
onChange={(e) =>
setForm({ ...form, age: Number(e.target.value) })
}
/>
</div>
);
}
export default App;
ここではFormStateという型を作り、フォーム全体のルールをまとめています。これにより、項目が増えても型で管理できます。
6. チェックボックスや真偽値の管理
チェックボックスは「オンかオフか」という状態なので、真偽値で管理します。TypeScriptではboolean型を使います。
function App() {
const [agree, setAgree] = useState<boolean>(false);
return (
<div>
<p>同意:{agree ? "はい" : "いいえ"}</p>
<input
type="checkbox"
checked={agree}
onChange={(e) => setAgree(e.target.checked)}
/>
</div>
);
}
checkedを使うことで、真偽値とフォームの状態を正しく結びつけられます。
7. 型安全なフォーム管理でよくあるミスを防ぐ
初心者がつまずきやすいのは、次のような点です。
- 文字と数値を混ぜて扱ってしまう
- Stateの初期値があいまい
- フォームが増えてStateの役割が分からなくなる
型をしっかり決めることで、「何が入るStateなのか」が一目で分かり、ミスを減らせます。
8. フォーム全体を型で守る考え方
型安全なフォーム入力のState管理では、「フォーム全体を一つのデータ」として考えるのがコツです。
入力項目をオブジェクトにまとめ、型でルールを決めると、ReactとTypeScriptの強みを活かせます。
フォームはユーザーが直接触る部分なので、エラーが出にくい設計がとても大切です。型安全なState管理は、その土台になります。