4
3

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 Hook Formとは

React Hook Form は、Reactでフォームを扱いやすくするためのライブラリです。

React では通常、フォームの各入力欄を useState で管理し、それを集めてバリデーションして…という処理が必要になります。
React Hook Form を使うと、そういった作業を簡潔に書けるようになります。

具体的には以下のようなことができます:

  • 入力値の管理
  • バリデーション(必須、桁数、数値制限など)
  • エラーメッセージの表示
  • フォームの送信処理

Reactとの関係性

React Hook Form の中核は useForm() というカスタムフックです。
これは React の Hook システム(useState や useEffect など)と同じ考え方で、フォームの状態を扱えるようにしたものです。

React の設計に沿っているため、シンプルなコードが書けます

実際にどう使うのか

useForm の初期化

まずは useForm を使って、フォーム全体の管理を準備します。

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

const { register, handleSubmit, formState: { errors } } = useForm();
  • register
    • 各 input に適用して、フォームとして認識させる
  • handleSubmit
    • フォーム送信時にバリデーションを走らせてから処理を行う
  • errors
    • バリデーションでエラーになった項目の情報が入る

入力欄の登録

次に、フォームの中にある <input><textarea>register を使って登録します。

<input {...register("title", { required: "タイトルは必須です" })} />

ここで "title" はフィールド名です。オブジェクト形式でバリデーションルールも指定できます。

エラーの表示

バリデーションエラーがある場合は、errors に情報が入ります。
それを使って、該当する入力欄の下にエラー文を表示します。

{errors.title && <p>{errors.title.message}</p>}

フォーム送信処理

送信時には handleSubmit を使います。
バリデーションが通ったときのみ、引数で指定した関数が呼ばれます。

const onSubmit = (data) => {
  console.log(data); // data は各 register() に対応する値のまとまり
};

<form onSubmit={handleSubmit(onSubmit)}>
  {/* 各 input 要素 */}
  <button type="submit">送信</button>
</form>

よく使うバリデーションの例

register("time", {
  required: "時間の入力は必須です",
  min: {
    value: 1,
    message: "時間は0以上である必要があります"
  }
})

React Hook Form のメリット

  • 入力値を useState で個別に管理する必要がない
  • バリデーション処理をわかりやすく書ける
  • コードが短くなり、読みやすくなる

ちなみに、loadingはサポートしてなかったので今回私はそこだけuseStateを使いました。

参考リンク

ここに貼ってあるコードをコピペして使いました

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?