React Hook FormとYupで効率的なフォームバリデーションを実現する

Reactでフォームのバリデーションを簡単に行う方法を解説していきたいと思います。今回は、React Hook FormYupを使って、効率的なフォームバリデーションを実装する方法をご紹介します。これらのライブラリを使うことで、簡単にバリデーションルールを実装することができます。

必要なライブラリをインストールする

プロジェクトにreact-hook-formとyupをインストールします。そして、@hookform/resolversもインストールして、yupのスキーマをreact-hook-formに統合します。

npm install react-hook-form yup @hookform/resolvers

Yupでバリデーションスキーマを定義する

次にyupを使ってバリデーションスキーマを定義します。

以下の例では、名前とメールアドレスの入力フィールドのバリデーションルールを定義しています。

import * as yup from "yup";

const schema = yup.object().shape({
  name: yup.string().required("Name is required"),
  email: yup.string().email("Email is invalid").required("Email is required"),
});

React Hook Formを設定する

次に、react-hook-formのuseFormフックを使って、先ほど定義したバリデーションスキーマを設定します。

yupResolverを使ってyupのスキーマをresolverオプションとして渡します。

ここでバリデーションエラーが発生したときに補足できるようにformState: { errors }を定義しておきます。

import React from "react";
import { useForm, SubmitHandler } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";

type Inputs = {
  name: string;
  email: string;
};

const MyForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm<Inputs>({
    resolver: yupResolver(schema),
  });

  const onSubmit: SubmitHandler<Inputs> = data => {
    console.log(data);
  };

  //...
};

フォームとエラーメッセージを表示する

最後に、各入力フィールドとSubmitボタンを表示し、バリデーションエラーがある場合はエラーメッセージを表示できるようにします。

//...
return (
  <form onSubmit={handleSubmit(onSubmit)}>
    <input {...register("name")} placeholder="Name" />
    <p>{errors.name?.message}</p>

    <input {...register("email")} placeholder="Email" />
    <p>{errors.email?.message}</p>

    <button type="submit">Submit</button>
  </form>
);

まとめ

以上が、React Hook FormとYupを使った、フォームバリデーションを実装となります。

これらのライブラリを使うことで、フォームのバリデーションを簡単に実装していきたいですね。