👍

React-Hook-Formがシンプルで使いやすい👍

2021/08/17に公開

コード全体

import type { NextPage } from 'next'
import { useForm, SubmitHandler } from "react-hook-form";
import { ErrorMessage } from "@hookform/error-message";

type Inputs = {
  name: string;
  phone_number: number;
}

const Home: NextPage = () => {
  const {
    register,
    handleSubmit,
    formState: { errors }
  } = useForm<Inputs>({
    criteriaMode: "all"
  });

  const onSubmit: SubmitHandler<Inputs> = (data) => {
    alert(JSON.stringify(data));
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label>名前</label>
      <input {...register("name")} />
      <label>電話番号</label>
      <input
        {...register("phone_number", { 
          required: "必須項目です", 
          pattern: {
            value: /\d+/,
            message: "数字で入力して"
          }
        })}
      />
      <ErrorMessage
        errors={errors}
        name="phone_number"
        render={({ messages }) => {
          return messages
            ? Object.entries(messages).map(([type, message]) => (
                <p key={type}>{message}</p>
              ))
            : null;
        }}
      />
      <input type="submit" />
    </form>
  )
}

export default Home

解説

const {
    register,
    handleSubmit,
    formState: { errors }
  } = useForm<Inputs>({
    criteriaMode: "all"
  });

まず、useFormを呼び出して使いたいメソッドを書く。
useFormの引数にonSubmitイベントのトリガーを指定する。(オプション)
参考:https://react-hook-form.com/api/useform/

<label>電話番号</label>
    <input
      {...register("phone_number", { 
        required: "必須項目です", 
        pattern: {
          value: /\d+/,
          message: "数字で入力して"
        }
      })}
    />
    <ErrorMessage
      errors={errors}
      name="phone_number"
      render={({ messages }) => {
        return messages
          ? Object.entries(messages).map(([type, message]) => (
              <p key={type}>{message}</p>
            ))
          : null;
      }}
    />

ErrorMessageのrenderに細かくバリデーションを指定できる。

Discussion

ログインするとコメントできます