16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ReactでのZodを使ったフォームバリデーションの基礎と実践

Last updated at Posted at 2024-06-05

はじめに

今回はZodを用いたReactのバリデーションの基礎と実践について記事を書きました。
業務で使うことが非常に多いので、基礎を学びながら学習したことをアウトプットしています。

Zodとは何か

Zodは、JavaScriptおよびTypeScriptのための型 セーフなスキーマ定義とバリデーションライブラリ です。
Zodを使用すると、データの構造や形式を明示的に定義 し、そのスキーマに基づいてデータをバリデートすることができます。
これにより、データの一貫性を保ち、バグを減らすことができます。

なぜZodを選ぶのか

型セーフティ

TypeScriptとの統合がスムーズで、型情報を利用してコードの安全性を向上させます。
簡潔なAPI:直感的なAPIにより、複雑なスキーマも簡単に定義できます。

柔軟性

カスタムバリデーションや複雑な構造のデータにも対応可能です。

パフォーマンス

軽量で高速なバリデーションを提供しています。

導入

Zodのインストール - 必要なライブラリのインストール手順

ZodをReactアプリケーションで使用するためには、まず必要なライブラリをインストールします。

コマンド
// npm
npm install zod react-hook-form

// yarn
yarn add zod react-hook-form

基本的な使用例 - シンプルなスキーマの定義

Zodを使用してシンプルなスキーマを定義します。
ここでは、ユーザー情報をバリデートするスキーマを作成します。

validation.ts
import { z } from 'zod';

const userSchema = z.object({
  name: z.string().min(1, "名前は必須です"),
  email: z.string().email("有効なメールアドレスを入力してください"),
  age: z.number().min(18, "18歳以上である必要があります"),
});

使用したZodのメソッド

.min()

数値や文字列の最小値を指定する ために使われます。
具体的には、文字列の場合は最小文字数を、数値の場合は最小値を設定します。

今回のバリデーションでは、nameSchemaは1文字以上の文字列である必要があります。1文字未満の場合は、エラーメッセージ「名前は必須です」が表示されます。

また、ageSchemaは 18以上の数値である必要があります。18未満の場合は、エラーメッセージ「18歳以上である必要があります」が表示されます。

.email()

文字列が有効なメールアドレス形式であるかどうかをバリデーションするために使われます。.email()メソッドを使うことで、ユーザーが入力したメールアドレスは適切な形式になっているかをチェックできます。

データのバリデーション

定義したスキーマを使用してデータをバリデートします。

form.tsx
const userData = {
  name: "Taro",
  email: "taro@example.com",
  age: 20,
};

const result = userSchema.safeParse(userData);

if (result.success) {
  console.log("バリデーション成功:", result.data);
} else {
  console.log("バリデーション失敗:", result.error.errors);
}

メソッドについて

safeParse

与えられたデータをスキーマに基づいてバリデーションし、その結果を安全に扱うためのものです。safeParseメソッドは、バリデーションの成功・失敗に関わらず、常にオブジェクトを返します
このオブジェクトには、バリデーションが成功したかどうかを示すsuccessプロパティと、成功した場合はバリデートされたデータ、失敗した場合はエラーメッセージが含まれます。

safeParseの利点

安全なエラーハンドリング
バリデーションの結果をオブジェクトとして返すため、一貫した結果 : try-catchブロックを使用せずにバリデーションエラーを安全に処理 できます。

一貫した結果
バリデーションの成功・失敗に関わらず、常に同じ形式のオブジェクトを返すため、処理がシンプルになります。

Reactとの統合 - React Hook Formとの連携

次に、React Hook FormとZodを組み合わせてフォームバリデーションを行う方法です。

TestForm.tsx
import React from 'react';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const userSchema = z.object({
  name: z.string().min(1, "名前は必須です"),
  email: z.string().email("有効なメールアドレスを入力してください"),
  age: z.number().min(18, "18歳以上である必要があります"),
});

const App = () => {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: zodResolver(userSchema)
  });

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

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label>名前:</label>
        <input {...register('name')} />
        {errors.name && <span>{errors.name.message}</span>}
      </div>
      <div>
        <label>メールアドレス:</label>
        <input {...register('email')} />
        {errors.email && <span>{errors.email.message}</span>}
      </div>
      <div>
        <label>年齢:</label>
        <input type="number" {...register('age')} />
        {errors.age && <span>{errors.age.message}</span>}
      </div>
      <button type="submit">送信</button>
    </form>
  );
};

export default App;

ライブラリー・オブジェクト・関数 について

zodResolver

React Hook FormとZodを統合するためのユーティリティ関数です。
React Hook Formは、フォームの状態管理とバリデーションをシンプルに行うためのライブラリで、zodResolverを使用することで、Zodスキーマを使ったバリデーションを簡単にReact Hook Formに組み込むことができます。

useForm

React Hook Formライブラリの主要なフックで、フォームの状態管理とバリデーションを行うために使用されます。
このフックを使用することで、フォームの入力値、バリデーションエラーメッセージ、フォームの送信処理などを簡単に管理できます。

register

フォームの入力フィールドをReact Hook Formに登録するための関数です。
これを使用することで、フォームのデータバインディングとバリデーションが自動的に管理されます。registerを使用して入力フィールドを登録することで、React Hook Formがそのフィールドの値を追跡し、バリデーションを適用できます。

handleSubmit

フォームの送信処理を行うための関数です。
フォームが送信されたときに、バリデーションを実行し、バリデーションが成功した場合に指定されたコールバック関数を呼び出します。失敗した場合は、バリデーションエラーがformState.errorsに格納されます.

コールバック関数

errors
各フィールドのバリデーションエラーを保持するオブジェクト。

isSubmitting
フォームが送信中であるかどうかを示すブール値

isDirty
フォームに変更があったかどうかを示すブール値

isValid
フォームがバリデーションに合格しているかどうかを示すブール値

onSubmit

フォームが送信されたときに呼び出されるコールバック関数です。
React Hook Formでは、handleSubmit関数と組み合わせて使用されます。

handleSubmitは、フォーム送信時にバリデーションを実行し、バリデーションが成功した場合にonSubmit関数を呼び出します。

formState

フォームの状態に関する情報を提供するオブジェクトです。
formStateには、フォームのエラー、送信状態、変更状態などが含まれます。
主にバリデーションエラーの表示フォームの送信状態の管理に使用されます。

handleSubmit

React Hook Formの関数で、フォームが送信されたときにバリデーションを実行し、バリデーションが成功した場合に指定したコールバック関数(通常はonSubmit関数)を呼び出します。
handleSubmitは、フォームの送信処理を簡素化し、バリデーションエラーの管理を自動化するために使用されます。

実装内容

上記の例ではReact Hook FormとZodを使用してフォームのバリデーションを行い、エラーメッセージを表示しています。
各入力フィールドに対してerrorsオブジェクトをチェックし、該当するエラーメッセージを表示することで、ユーザーに適切なフィードバックを提供します。

Zodのよくある使用方法

Zod、React Hook Form、React Queryを組み合わせて使用されます。
今回は React Query を用いた例ではありませんがいずれは紹介したいと思います。

Zod
スキーマベースのバリデーションライブラリで、データの構造を定義し、そのデータが期待される形式に従っているかどうかをチェックします。

React Hook Form
フォームの状態管理ライブラリで、フォームの入力値、バリデーション、送信処理を簡単に扱うことができます。

React Query
サーバーからのデータ取得、キャッシュ、同期を効率的に行うライブラリです。

まとめ

Zodは、Reactアプリケーションにおけるフォームバリデーションをシンプルかつ強力にするツールです。
TypeScriptとの相性も良く、複雑なバリデーション要件にも柔軟に対応できます。
React Hook Formと組み合わせることで、直感的かつ堅牢なフォームバリデーションを実現することができます。ぜひ、Zodを活用して、より信頼性の高いアプリケーションを構築してください。

さいごに

最後まで、お読みいただきありがとうございました。
勉強しながら記事を投稿できたらいいな‥!!と思っています。

リンク

16
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?