環境は
react : 16.12
typescript : 3.7
react-hook-form : 4.7.2
でお送りします。

インストール

npmでライブラリのインストールをしましょう。

$ npm install react-hook-form

一つだけのバリデーション

準備ができたのでさっそく使ってみましょう。
最初に入力が必須のバリデーションを設定してみます。
InputFormというフォーム用のコンポーネントを作る想定で進めます。

  1. import React, { useState } from 'react'
  2. import { useForm } from 'react-hook-form'
  3.  
  4. type FormData = {
  5. title: string
  6. }
  7.  
  8. const InputForm: React.FC = () => {
  9. const { register, handleSubmit, errors, reset } = useForm<FormData>()
  10.  
  11. const handleOnSubmit = (data: FormData) => {
  12. console.log(data.title);
  13. reset()
  14. }
  15.  
  16. return (
  17. <div>
  18. <form onSubmit={handleSubmit(handleOnSubmit)}>
  19. <input
  20. type="text"
  21. className={errors.title && 'error'}
  22. name="title"
  23. ref={register({
  24. required: 'タイトルは必ず入力してください。'
  25. })}
  26. />
  27. { errors.title && <span className="error-message">{ errors.title.message }</span> }
  28. <button className="btn is-primary">追加</button>
  29. </form>
  30. </div>
  31. )
  32. }
  33.  
  34. export default InputForm
2行目
useFormを使用するので、インポートしましょう。
3〜6行目
TypeScriptを使用している場合はフォームに使用する型を設定します。
9行目
useFormで使用する機能を変数に入れます。
11行目
フォームが送信されたとき実行される関数です。(18行目で設定してます。)
引数は設定したFormDataの形式で扱うことができます。
reset関数でインプットに入力した値をクリアーすることができます。
18行目
formhandleSubmitを設定する必要があるので基本的にそのまま書きます。
21行目
エラーの時inputにもスタイル設定したいときは書きます。
23行目
バリデーションはrelに設定します。
「入力必須」の場合は、required: 'エラーメッセージ'という形で設定します。
27行目
エラーがあったとき表示するメッセージです。
エラーになるとerrors.title.messageregisterで設定した文字列が入ります。

複数のバリデーション

先ほどは必須だけでしたが、基本的には文字数を設定したりとか複数のバリデーションを組み合わせるのがほとんどだと思います。
必須条件に追加して、3文字以上、100文字以下の条件を追加してみましょう。

registerを次の様に変更しましょう。

  1. <input
  2. type="text"
  3. className={errors.title && 'error'}
  4. name="title"
  5. ref={register({
  6. required: 'タイトルは必ず入力してください。',
  7. minLength: { value: 3, message: 'タイトルは3文字以上入力してください。' },
  8. maxLength: { value: 100, message: 'タイトルは100文字以内で入力してください。' }
  9. })}
  10. />

minLengthmaxLengthに関しては制御する文字数も必要なので、valuemessageの形で設定します。

正規表現でカスタムバリデーションを設定する方法

バリデーションタイプは最低限のものしか用意されていないので、独自に設定する場合はpatternを使います。

  1. <input
  2. type="text"
  3. className={errors.title && 'error'}
  4. name="title"
  5. ref={register({
  6. required: '必ず入力してください。',
  7. pattern: {
  8. value: /^\d{3}-\d{4}$/,
  9. message: '正しい郵便番号を入力してください。'
  10. }
  11. })}
  12. />

基本的な使い方は以上です。
その他にも色々機能がありますので詳しくは、下記ドキュメントをご確認ください。

React Hook Form

この記事の動画(Youtube)版はこちら!