React-hook form onSubmit

React Hook Form onSubmit:フォーム送信をスマートに実装

React Hook Form onSubmit は、Reactでフォームを扱う際に非常に便利な機能です。useFormフックとhandleSubmit関数を組み合わせることで、フォームの値の管理、バリデーション、送信処理を簡潔に記述できます。この記事では、onSubmitを使ったフォーム送信の実装方法と、関連する便利な機能を解説します。

handleSubmit:フォーム送信処理を定義

handleSubmit関数は、useFormフックから提供される関数で、フォーム送信時の処理を定義するために使用します。onSubmitとして渡された関数は、フォームの値がバリデーションを通過した場合に実行されます。

javascript
import { useForm } from 'react-hook-form';

const MyForm = () => {
  const { register, handleSubmit } = useForm();
  const onSubmit = (data) => console.log(data);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("firstName")} />
      <button type="submit">送信</button>
    </form>
  );
}​

上記の例では、useFormフックを使ってフォームの管理を行い、handleSubmit(onSubmit)を使って送信時にonSubmit関数を実行しています。フォームが送信される前に、バリデーションが自動的に実行され、問題がなければデータがonSubmit関数に渡されます。

useFormフック:フォームの状態管理

useFormフックは、フォームの値、エラー、送信状態などを管理するためのフックです。このフックは、フォームの状態を簡単に管理できるようにするため、register関数、handleSubmit関数、formStateオブジェクトなどを提供します。フォームの初期化や状態変更が簡単にでき、複雑なフォームのロジックをシンプルに保つことができます。

javascript
const { register, handleSubmit, formState } = useForm();​

formStateオブジェクトには、エラー情報や送信状態を含む重要な情報が格納されます。

register関数:入力フィールドを登録

register関数は、入力フィールドをuseFormに登録するために使用します。name属性を指定することで、フォームの値としてアクセスできるようになります。また、バリデーションルールも指定できるため、フォームの入力チェックを簡単に行うことができます。

javascript
<input {...register("firstName", { required: true })} />​

上記の例では、firstNameというフィールドが必須入力であることを指定しています。このように、簡単にバリデーションルールを追加でき、フォームが送信される前に自動的に検証が行われます。

formStateオブジェクト:フォームの状態にアクセス

formStateオブジェクトは、フォームの状態に関する情報を提供します。主に次の情報を取得することができます。

  • errors: バリデーションエラーが発生した場合、そのエラー情報が格納されます。
  • isSubmitting: フォームが送信中かどうかの状態を示します。
  • isValid: フォームが完全にバリデーションを通過したかどうかを示します。
javascript
const { register, handleSubmit, formState } = useForm();
const { errors, isSubmitting } = formState;​

これにより、送信中の状態やエラー状態に基づいてUIを動的に更新することができます。

バリデーション:入力値の検証

register関数でバリデーションルールを指定することで、入力値の検証を行うことができます。たとえば、requiredminLengthなど、様々なバリデーションルールを簡単に設定できます。

javascript
<input {...register("email", { required: "メールアドレスは必須です", pattern: /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i })} />​

上記のコードでは、メールアドレスの入力を必須にし、かつ正規表現を使ってメールアドレスの形式を検証しています。バリデーションエラーがある場合、formState.errorsオブジェクトにエラー情報が格納され、ユーザーにフィードバックを返すことができます。

フォームの初期値とリセット:defaultValue、setValue、reset

  • defaultValue: 入力フィールドの初期値を設定します。
  • setValue: プログラムから入力フィールドの値を設定するために使用します。
  • reset: フォームを初期状態にリセットすることができます。
javascript
const { register, handleSubmit, setValue, reset } = useForm();

// setValueを使ってフィールド値を設定
setValue("firstName", "John");

// resetを使ってフォームを初期状態にリセット
reset();​

これらのメソッドを活用することで、動的にフォームの値を操作したり、送信後にフォームをリセットすることができます。

useFieldArray:配列形式の入力フィールドを扱う

useFieldArrayは、配列形式の入力フィールドを簡単に扱えるフックです。たとえば、複数の電話番号を入力できるフォームを作成する際に、項目を追加したり削除したりする処理を簡潔に実装できます。

javascript
import { useFieldArray, useForm } from "react-hook-form";

const MyForm = () => {
  const { register, control, handleSubmit } = useForm();
  const { fields, append } = useFieldArray({ control, name: "phones" });

  const onSubmit = (data) => console.log(data);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {fields.map((item, index) => (
        <div key={item.id}>
          <input {...register(`phones[${index}].number`)} defaultValue={item.number} />
        </div>
      ))}
      <button type="button" onClick={() => append({ number: "" })}>電話番号を追加</button>
      <button type="submit">送信</button>
    </form>
  );
};​

useFieldArrayを使うことで、配列形式のデータを簡単に操作でき、動的にフィールドの追加や削除を行うことができます。

エラーメッセージの表示:formState.errors

formState.errorsオブジェクトを使って、バリデーションエラーが発生したフィールドにエラーメッセージを表示できます。

javascript
{errors.firstName && <span>{errors.firstName.message}</span>}​

上記のコードでは、firstNameフィールドにエラーがある場合にエラーメッセージを表示しています。バリデーションエラーに応じてユーザーにフィードバックを提供することができます。

まとめ:React Hook Formでフォームを簡単に実装

React Hook Form onSubmitは、Reactでフォームを扱うための効率的で強力なツールです。useFormhandleSubmitregisterformState、そしてuseFieldArrayを活用することで、フォームの実装と管理をシンプルに行うことができます。これにより、フォームのバリデーション、状態管理、送信処理を簡潔に記述でき、コードの可読性と保守性が向上します。

参考文献

この内容についてさらに詳しく知りたい方は、以下のリソースをご覧ください:

React Hook Form: Getting Started
React Hook Form: useForm API

関連する質問と回答

Q1: React Hook Formはどのようにしてバリデーションを管理しますか?
A1: React Hook Formでは、各フィールドにバリデーションルールを登録することでバリデーションを管理します。formikよりもシンプルです。
Q2: onSubmitメソッドはどのタイミングで呼び出されますか?
A2: onSubmitメソッドは、フォームが正常に送信されたときに呼び出されます。
Q3: エラー処理はどのように実装するのですか?
A3: formStateからエラー情報を取得し、必要に応じて表示することができます。

その他の参考記事:form onsubmit