🐰

【typescript, React】react-hook-formでフォームを作るために必要最低限なこと

2021/12/03に公開1

概要

react-hook-formを用いた、フォームの作り方を説明します。
validationなどの設定は置いておいて、本当に必要最低限のフォームを作るために必要なことをメモします。
言語はtypescriptを使用しています。

手順

  1. react-hook-formのインストールとimport
  2. 取得したいデータの型を定義する
  3. registerとhandleSubmitをuseFormを用いて定義する。
  4. handleOnSubmitを定義する。(関数名は他の名前でOK)
  5. HTMLの記述

順を追って説明していきます。

具体的な実装

1.react-hook-formのインストールとimport

ターミナルを立ち上げて以下のコマンドを入力してください。

terminal
$ yarn add react-hook-form

その後react-hook-formを使いたいファイル内でimport文を書きます。

import { SubmitHandler, useForm } from 'react-hook-form'

ここでimportしたものは後で使用します。重要なのはuseFormです。

2. 取得したいデータの型を定義する

(例)

type ValuesType = {
  name: string
  age: number
  phone: number
}

上記のようにして入力してもらいたデータの型を定義しましょう。
フォームの値につける変数名:そのデータの型
のようにして定義していきます。

3. registerとhandleSubmitをuseFormを用いて定義する。

(例)

const { register, handleSubmit } = useForm<ValuesType>({
    mode: "onSubmit",
    reValidateMode: "onChange",
});

このようにしてregisterとhandleSubmitを定義します。これらの変数の名前は変更しないようにしましょう。
(もちろんmodeやreValidateModeには様々な変数を割り当てることができますし、それ以外にも多くのオプションを利用可能です。詳しくは公式のドキュメントが詳しいと思います。)

4. handleOnSubmitを定義します。

(例)

const handleOnSubmit: SubmitHandler<ValuesType> = (data) => {
    console.log(data)
}

最初にimportしたSubmitHandlerを型宣言に用います。
今回はコンソールに取得したデータを表示させているだけです。
(apiにそのデータを渡したいときは、ここでaxiosなどを用いてPostなどを行うことができます。)

5. HTMLの記述

(例)

return (
        <form
          onSubmit={handleSubmit(handleOnSubmit)}
        >
            <input
            type="text"
            {...register('name')}
            />
            <input
            type="number"
            {...register('age')}
            />
            <input
            type="number"
            {...register('phone')}
            />
            <input type="submit" />
        </form>
)

このようにしてフォームを作成します。inputタグの中の{...register('name')}という部分が肝で、これによって入力されたデータがどのデータに対応しているのかを記述しています。

まとめ

今回は必要最低限のreact-hook-formの使い方を説明しました。
個人的にはここまでくるのが、一番大変だったので記事にしました。
あとは色々なオプションについて公式ドキュメントなどを参照しながら、勉強してみてください!

Discussion

nap5nap5

登録ないし更新ボタンなどのCTAボタンは

  • 登録時
    • 初期表示に非活性にして、有効な値であるときに活性化
  • 編集時
    • デフォルト値から有効な変更点がある場合のみ、活性化、それ以外は非活性

のように僕の場合は意識しています。

少しバギーですが、デモつくってみました。

/basic/create >>> 登録時
/basic/edit >>> 編集時

https://codesandbox.io/p/sandbox/crazy-nobel-1qml1b?file=%2Fsrc%2Ffeatures%2Fbasic%2Fcomponents%2FCreateForm.tsx&selection=[{"endColumn"%3A11%2C"endLineNumber"%3A17%2C"startColumn"%3A11%2C"startLineNumber"%3A17}]

簡単ですが、以上です。