環境は
react : 16.12
typescript : 3.7
react-hook-form : 4.7.2
でお送りします。
インストール
npmでライブラリのインストールをしましょう。
$ npm install react-hook-form
一つだけのバリデーション
準備ができたのでさっそく使ってみましょう。
最初に入力が必須のバリデーションを設定してみます。
InputForm
というフォーム用のコンポーネントを作る想定で進めます。
- import React, { useState } from 'react'
- import { useForm } from 'react-hook-form'
- type FormData = {
- title: string
- }
- const InputForm: React.FC = () => {
- const { register, handleSubmit, errors, reset } = useForm<FormData>()
- const handleOnSubmit = (data: FormData) => {
- console.log(data.title);
- reset()
- }
- return (
- <div>
- <form onSubmit={handleSubmit(handleOnSubmit)}>
- <input
- type="text"
- className={errors.title && 'error'}
- name="title"
- ref={register({
- required: 'タイトルは必ず入力してください。'
- })}
- />
- { errors.title && <span className="error-message">{ errors.title.message }</span> }
- <button className="btn is-primary">追加</button>
- </form>
- </div>
- )
- }
- export default InputForm
- 2行目
- useFormを使用するので、インポートしましょう。
- 3〜6行目
- TypeScriptを使用している場合はフォームに使用する型を設定します。
- 9行目
- useFormで使用する機能を変数に入れます。
- 11行目
-
フォームが送信されたとき実行される関数です。(18行目で設定してます。)
引数は設定したFormData
の形式で扱うことができます。
reset
関数でインプットに入力した値をクリアーすることができます。 - 18行目
form
にhandleSubmit
を設定する必要があるので基本的にそのまま書きます。- 21行目
- エラーの時inputにもスタイル設定したいときは書きます。
- 23行目
-
バリデーションは
rel
に設定します。
「入力必須」の場合は、required: 'エラーメッセージ'
という形で設定します。 - 27行目
-
エラーがあったとき表示するメッセージです。
エラーになるとerrors.title.message
にregister
で設定した文字列が入ります。
複数のバリデーション
先ほどは必須だけでしたが、基本的には文字数を設定したりとか複数のバリデーションを組み合わせるのがほとんどだと思います。
必須条件に追加して、3文字以上、100文字以下の条件を追加してみましょう。
register
を次の様に変更しましょう。
- <input
- type="text"
- className={errors.title && 'error'}
- name="title"
- ref={register({
- required: 'タイトルは必ず入力してください。',
- minLength: { value: 3, message: 'タイトルは3文字以上入力してください。' },
- maxLength: { value: 100, message: 'タイトルは100文字以内で入力してください。' }
- })}
- />
minLength
とmaxLength
に関しては制御する文字数も必要なので、value
、message
の形で設定します。
正規表現でカスタムバリデーションを設定する方法
バリデーションタイプは最低限のものしか用意されていないので、独自に設定する場合はpattern
を使います。
- <input
- type="text"
- className={errors.title && 'error'}
- name="title"
- ref={register({
- required: '必ず入力してください。',
- pattern: {
- value: /^\d{3}-\d{4}$/,
- message: '正しい郵便番号を入力してください。'
- }
- })}
- />
基本的な使い方は以上です。
その他にも色々機能がありますので詳しくは、下記ドキュメントをご確認ください。
React Hook Form
この記事の動画(Youtube)版はこちら!