useStateとwatchの違いとは?フォーム入力の管理方法を解説!

useStateとwatchの違いとは?フォーム入力の管理方法を解説! React
useStateとwatchの違いとは?フォーム入力の管理方法を解説!
この記事は約9分で読めます。

でじぼうです。

Reactでフォームを扱うときに、よく登場するのが「useState」と「watch」という言葉。
どちらも値の変化を扱うための機能ですが、意味や使い方は少し違います。

でじぼう
でじぼう

この記事は下記の方がおすすめ!

  • useStateってなに?
  • wacthってなに?
  • useStateとwatchの違いとは?

Instagramフォロワー数9,500人を越える人気のもち・大福店 えにかいたもち

useStateについて

useStateとは?

Reactに標準で用意されている 状態を保持・管理するための関数 です。
フォームの入力値やボタンのカウントなど、変化する値を保持できます。

どんなときに使う?

  • 入力フォームの値をリアルタイムで表示したいとき
  • 入力に応じて画面の動きを変えたいとき(例:ボタンの活性化・非表示切替など)

実際のコード

import { useState } from "react";

function ProfileForm() {
  const [name, setName] = useState<string>("");
  const [email, setEmail] = useState<string>("");
  const [age, setAge] = useState<number | undefined>(undefined);

  return (
    <div>
      <input
        type="text"
        placeholder="名前"
        value={name}
        onChange={(e) => setName(e.target.value)}
      />
      <input
        type="email"
        placeholder="メールアドレス"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
      />
      <input
        type="number"
        placeholder="年齢"
        value={age ?? ""}
        onChange={(e) => setAge(Number(e.target.value))}
      />

      <p>名前: {name}</p>
      <p>メール: {email}</p>
      <p>年齢: {age}</p>
    </div>
  );
}

export default ProfileForm;

使用上の注意点

  • 値の更新はすべて自分で onChange を書く必要がある
  • 入力項目が多くなると useState の数も増える

watchについて

watchとは?

watch は、React Hook Form というフォーム管理ライブラリの関数で、フォームの入力値をリアルタイムで「監視」できます。

watch は React に標準で含まれているわけではありません。
使うには、まず下記コマンドで React Hook Form を別途インストールする必要があります。

npm install react-hook-form

どんなときに使う?

  • フォームの入力値を簡単に取り出したいとき
  • 複数のフォーム項目をまとめて管理したいとき
  • バリデーションや送信処理もラクにしたいとき

実際のコード

import { useForm } from "react-hook-form";

type FormData = {
  name: string;
  email: string;
  age: number | undefined;
};

function ProfileForm() {
  const { register, watch } = useForm<FormData>({
    defaultValues: {
      name: "",
      email: "",
      age: undefined,
    },
  });

  const { name, email, age } = watch();

  return (
    <div>
      <input type="text" placeholder="名前" {...register("name")} />
      <input type="email" placeholder="メールアドレス" {...register("email")} />
      <input type="number" placeholder="年齢" {...register("age", { valueAsNumber: true })} />

      <p>名前: {name}</p>
      <p>メール: {email}</p>
      <p>年齢: {age}</p>
    </div>
  );
}

export default ProfileForm;

使用上の注意点

  • React Hook Form の register とのセットが必要
  • 初期値が指定されていないと undefined になることがある

useState と watch の違い【比較表】

下記に、useState と watch の違いをまとめました。

項目useStatewatch
用途値の保存と更新入力値のリアルタイム監視
更新方法自分で onChange を書く自動で監視される
導入のしやすさ標準のReactで使えるライブラリのインストールが必要
向いている規模小規模なフォーム項目数が多いフォーム
型管理(TypeScript)一つずつ型を指定useForm<FormData>()で一括管理

結局どっちを使うべき?

  • 小さいフォーム → useState が手軽
  • 入力項目が多い or バリデーションも管理したい → watch(React Hook Form)がおすすめ

React Hook Formを使えば、フォーム管理がスッキリ書けて、バリデーションも簡単に組み込めます。

コメント

タイトルとURLをコピーしました