react-hook-form 基本的な使い方② (チェックボックスなど)

本投稿では、react-hook-formを使用した以下の要素の基本的な記述方法についてまとめる。

  • チェックボックス
  • ラジオボタン
  • セレクトボックス

コード例

コードの解説については、コメントとして残す。

import { useForm, SubmitHandler } from "react-hook-form"

// 型を定義 : cb(チェックボックス), rg(ラジオボタン), sb(セレクトボックス)
type FormValue = {
  cb: string[];
  rg: string;
  sb: string;
}

export default function MyForm() {
  
  const {
    register,
    handleSubmit,
    formState: { errors }
  } = useForm<FormValue>({
    // デフォルト値を設定
    defaultValues: {
      cb: ["value1"], // チェックボックスの初期値を設定
      rg: "value1" // ラジオボタンの初期値を設定
    }
  });

  // 送信ボタンが押下された際のイベント
  const onSubmit: SubmitHandler<FormValue> = (data) => {
    console.log("submit", data)
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label>チェックボックス</label>
        <div>
          <label>
            {/* 以下のバリデーションを設定 */}
            {/* いずれかのチェックボックスを選択しているか */}
            {/* 全て選択していないか(一つのみ選択可能) */}
            <input
              type='checkbox'
              value="value1"
              {...register("cb", {
                validate: {
                  required: (value) =>
                    value.length > 0 || "少なくとも一つ選択してください。",
                  maxLength: (value) => 
                      value.length <=1 || "いずれか一方のみ選択可能です。"
                }
              })}
            />
            value1
          </label>
          <label>
            <input
              type="checkbox"
              value="option2"
              {...register("cb")}
            />
            value2
          </label>
        </div>
        {errors.cb && (
          <p style={{ color: "red", fontWeight: "bold" }}>{errors.cb.message}</p>
        )}
      </div>
      <div>
        <label>ラジオボタン</label>
        <div>
          <label>
            <input
              type='radio'
              value='value1'
              {...register("rg")}
            />
            value1
          </label>
          <label>
            <input
              type='radio'
              value='value2'
              {...register("rg")}
            />
            value2
          </label>
        </div>
      </div>
      <div>
        <label>セレクトボックス</label>
        {/* 以下のバリデーションを設定 */}
        {/* いずれかの要素が選択されているか(デフォルト値の選択してくださいもNG)  */}
        <select
          {...register("sb", {
            required: "選択肢を選択してください"
          })}
        >
          <option value="">選択してください</option>
          <option value="value1">Value1</option>
          <option value="value2">Value2</option>
          <option value="value3">Value3</option>
        </select>
        {
          errors.sb && <p style={{ color: "red", fontWeight: "bold" }}>{ errors.sb.message }</p>
        }
      </div>
      <button type='submit'>送信</button>
      <button type="reset">リセット</button>
    </form>
  )
}

動作例

以下、動作例。

Follow me!

コメントを残す

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