react-hook-form 基本的な使用方法

近頃は、react-hook-formを利用し、フォーム入力/送信周りの実装(バリデーションも合わせて実装が可能)をするケースは多く見られるため、使用方法を残しておく。

インストール

以下は最新のバージョンをインストールする場合の例。

npm install react-hook-form@latest

サンプルコード

以下、サンプルコード(TypeScriptを使用した場合の例)

import { useState } from 'react';
import { useForm, SubmitHandler } from 'react-hook-form'

// 型を定義
type FormValue = {
  email: string;
  password: string;
  confirmPassword: string;
}

const MyForm = () => {

  // register、handleSubmit、errorsなどの関数やオブジェクトを取得
  // 型は、FormValueを設定
  const {
    register,
    handleSubmit,
    formState: {errors}
  } = useForm<FormValue>();

  // 送信ボタンが押下された場合のイベント
  // 型としてSubmitHandlerを設定
  const onSubmit: SubmitHandler<FormValue> = (data) => {
    console.log("submit", data)
  }

  // パスワード
  const [password, setPassword] = useState<string>("")

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label>メールアドレス</label>
        {/* バリデーションとして以下を設定 */}
        {/* 必須項目 */}
        {/* ○○○@◽️◽️.▲▲▲の形式であるかの確認 */}
        <input 
          type="text"
          {...register("email", {
            required: "メールアドレスを入力してください。",
            pattern: { value: /^[a-zA-Z0-9._]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$/, message: "○○○@◽️◽️.▲▲▲の形式で入力してください。" }
          })}
        />
        {/* メールアドレスが未入力の場合のエラーメッセージ */}
        {
          errors.email?.type === "required" && <p style={{ color: 'red', fontWeight: 'bold' }}>{ errors.email.message }</p>
        }
        {/* ○○○@◽️◽️.▲▲▲の形式でない場合のエラーメッセージ */}
        {
          errors.email?.type === "pattern" && <p style={{ color: 'red', fontWeight: 'bold'  }}>{ errors.email.message }</p>
        }
      </div>
      <div>
        <label>パスワード</label>
        {/* バリデーションとして以下を設定 */}
        {/* 必須項目 */}
        {/* 半角英数字と記号(!?%_-+)が必ず含まれている かつ 8文字以上 */}
        <input 
          type="password"
          {...register("password", {
            required: "パスワードを入力してください。",
            pattern: { value: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!?%_\-+])[a-zA-Z\d!?%_\-+]{8,}$/, message: "半角英数字と記号(!?%_-+)が必ず含まれている かつ 8文字以上である必要があります。"}
          })}
          onChange={(e) => setPassword(e.target.value)}
        />
        {/* パスワードが未入力の場合のエラーメッセージ */}
        {
          errors.password?.type === "required" && <p style={{ color: 'red', fontWeight: 'bold'  }}>{ errors.password.message }</p>
        }
        {/* 半角英数字と記号(!?%_-+)が必ず含まれている かつ 8文字以上 を満たしていない場合のエラーメッセージ */}
        {
          errors.password?.type === "pattern" && <p style={{ color: 'red', fontWeight: 'bold'  }}>{ errors.password.message }</p>
        }
      </div>
      <div>
        <label>パスワード再入力</label>
        {/* バリデーションとして以下を設定 */}
        {/* 必須項目 */}
        {/* パスワードが一致しているか */}
        <input 
          type="password"
          {...register("confirmPassword", {
            required: "パスワードの確認は必須です。",
            validate: value => 
              value === password || "パスワードが一致しません。"
          })}
        />
        {/* 確認用パスワードが未入力の場合のエラーメッセージ */}
        {
          errors.confirmPassword?.type === "required" && <p style={{ color: 'red', fontWeight: 'bold'  }}>{ errors.confirmPassword.message }</p>
        }
        {/* パスワードが一致していない場合のエラーメッセージ */}
        {
          errors.confirmPassword?.type === "validate" && <p style={{ color: 'red', fontWeight: 'bold'  }}>{ errors.confirmPassword.message }</p>
        }
      </div>
      <button type="submit">送信</button>
      <button type="reset">リセット</button>
    </form>
  )
}

export default MyForm;

動作確認

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です