【React.js/Next.js】React Hook Form + Zod 完全入門

React.js / Next.js

React Hook Form ってどんな機能があるの?

今回は、React.js でフォームを扱う際によく使われるライブラリ React Hook Form について、バリデーションライブラリの Zod と合わせて、基本的な考え方から実際の使い方、よくあるユースケースまでをわかりやすく解説します。

React Hook Form とは?

React Hook Form は、React.jsフォーム を扱うための ライブラリ です。
入力値の状態管理を最小限に抑える設計 により、再レンダリングを抑えつつ、少ないコードで高速なフォームを実装できる のが特徴です。

  • 再レンダリングが少なく、パフォーマンスが高い
  • シンプルなAPIで直感的に使える
  • バリデーションが書きやすく、Zod などの外部ライブラリとも簡単に連携できる
  • TypeScript との相性が良い

なぜ React Hook Form を使うのか?

useState でフォームを実装した場合の課題

useState を使ってフォームを実装した場合、input の数が増えるにつれて、管理する state も増えるため、再レンダリングが頻繁に発生 してしまいます。
その結果、パフォーマンスが低下 しやすく、バリデーションのロジックも分散しがち のため、コード全体が複雑になり、可読性や保守性も下がってしまいます

こうした課題を解決してくれるのが React Hook Form です。

コード例

useState でフォームを実装したコード例

  • useStateemail と password を 初期化 する
  • inputstate と紐づけ、入力のたびに state を更新 する
  • state の更新により 再レンダリングが発生し入力値が反映 される
  • フォーム送信時に handleSubmit が実行されページ遷移を防止 する
  • emailpassword を取得 して、ログに表示 する
  • 送信後に state をリセット し、入力欄を初期化 する

処理フロー

  1. ログインボタンを押す と何も入力していないため、ログの EmailPassword には ‘ ‘(空白) が表示される
  2. EmailPassword にそれぞれ入力し、再度 ログイン ボタンを押すと、ログに入力した EmailPassword がそれぞれ表示される

React Hook Form でフォームを実装した場合

React Hook Form を使ってフォームを実装すると、input の状態管理を React.js の state で持たずに済む ため、全体のコード量が減り、再レンダリングも最小限に抑えられます。

バリデーションも簡単に追加 でき、Zod などの 外部ライブラリと組み合わせる ことで、より実務向きのフォームを効率的に作成できます。

フォームの数や入力項目が増えても簡潔なコードで管理できるのが大きなメリット です。

React Hook Form でフォームを実装したコード例

React Hook Form のインストール
React Hook Form のコード例
  • useFormフォーム全体の状態 と、入力登録や送信処理に必要な設定を初期化 する
    useForm
  • registerinputフォームに登録 し、入力値は React Hook Form内部で管理 し、必要なときだけ再レンダリング される ※ register
  • フォーム送信時handleSubmitバリデーションを実行 する ※ handleSubmit
  • バリデーションエラーは、formStateerrors に自動で格納される ※ formState
  • エラーなど問題がなければ onSubmit が呼ばれ、入力値をまとめて取得する

処理フロー

  1. ログインボタンを押す と何も入力していないため、’メールアドレスは必須です‘ と ‘パスワードは必須です‘ と エラーが表示 される
  2. EmailPassword にそれぞれ入力すると、エラー が消え、表示されなくなる
  3. 再度 ログイン ボタンを押すと、ログに入力した EmailPassword が表示される

React Hook Form + Zod でフォームを実装した場合

React Hook Form + Zod でフォームを実装したコード例

Zod のインストール
React Hook Form + Zod のコード例
  • Zodフォーム全体のバリデーションルールを定義 する ※ Zod
  • useForm に zodResolver を渡し、バリデーション処理を統合するuseForm
  • register で input をフォームに登録し、入力値は React Hook Form内部で管理 し、必要なときだけ再レンダリング される ※ register
  • 指定した modeonSubmit: 送信時 ※デフォルト)に応じてバリデーションが実行 される
  • バリデーションエラーZod によって検証され、formStateerrors に自動で反映される ※ formState
  • フォーム送信時に handleSubmit が検証を行い、エラーなど問題なければ onSubmit が呼ばれる ※ handleSubmit
  • 検証済みの入力値data としてまとめて取得できる

処理フロー

  1. ログインボタンを押す と何も入力していないため、’有効なメールアドレスを入力してください‘ と ‘パスワードは8文字以上入力してください‘ と エラーが表示 される
  2. EmailPassword にそれぞれ入力すると、エラー が消え、表示されなくなる
  3. 再度 ログイン ボタンを押すと、ログに入力した EmailPassword が表示される

まとめ

React.jsフォームを扱う際によく使われるライブラリ React Hook Form について、
バリデーションライブラリ である Zod とあわせて解説しましたが、いかがでしたでしょうか?

React Hook Form は、再レンダリングを抑えつつ、少ないコードで高速なフォームを実装できるのが特徴 です。
さらに Zod などの外部ライブラリと連携する ことで、バリデーションもシンプルに実装でき、実務でも扱いやすいフォーム を作成することができます。

まずは React Hook Form の基本的な使い方を押さえ、簡単なフォームで試しながら、
Zod との連携なども取り入れて、少しずつ React Hook Form に慣れていきましょう。

公式サイト

React Hook Form

Zod

tachu × tachu

Laravel / React フルスタックエンジニア

Webエンジニア歴15年、フリーランス歴8年で、PHP / Laravel を中心に、
React.js / Vue.js を用いたフルスタックでのWeb開発をしています。

技術記事は Laravel / React / Web開発 を中心に書いています。

Webサービスの開発、既存システム改善、機能追加、技術相談、小規模な開発など、お気軽にご相談ください。

React.js / Next.js
シェアする

コメント

タイトルとURLをコピーしました