😽

【react-hook-form】React×TypeScript×chakraUI/useFormを使ってバリデーションを実装しよう

2023/06/05に公開

Reactでフォームを作るときに、
ひとつひとつuseStateを使ったり、バリデーションを書くのが大変なのでReact Hook FormのuseFormを使います。

今回はchakraUIと併せて使っているので、
デザインも簡単に実装しています。

↓完成イメージ

react-hook-formをインストール

まずはインストールのコマンド入力。

$ npm install react-hook-form

useFormの実装

完成イメージのソースコードはこちらです。

import React from 'react';
import { FormLabel, Input, Button, VStack, Text, Box } from '@chakra-ui/react';


export const Register = () => {

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm();

  const handleRegisterSubmit =(data: any) => {
    // 処理を書く
  };

  return (
    <Box>
          <Text fontSize="xl">新規登録</Text>
          <VStack>
            <form
              onSubmit={handleSubmit(handleRegisterSubmit)}
              className="user-form"
            >
              <Box>
                <FormLabel htmlFor="email">
                  メールアドレス
                  <Input
                    id="email"
                    placeholder="メールアドレス"
                    // バリデーション
                    {...register('email', { required: true })}
                  />
                </FormLabel>
                {errors.email && (
                  <Text color="red.400">メールアドレスを入力してください</Text>
                )}
              </Box>
              <Box>
                <FormLabel htmlFor="password">
                  パスワード
                  <Input
                    type="password"
                    id="login-password"
                    placeholder="パスワード"
                    // バリデーション
                    {...register('password', { required: true })}
                  />
                </FormLabel>
                {errors.password && (
                  <Text color="red.400">パスワードを入力してください</Text>
                )}
              </Box>
              <Box>
                <Button mt={4} colorScheme="teal" type="submit">
                  登録
                </Button>
              </Box>
              <Text>ログイン画面へ</Text>
            </form>
          </VStack>
    </Box>
  );
};

methodについて

・register

フォームから入力された値のstate管理、バリデーション処理が可能です。
上記ソースコードでもフォームの値を受け取って、項目入力必須のバリデーション処理を書いています。

・handleSubmit

フォームをsubmitした時の処理を書きます。
handleSubmit()の引数は二つで、
引数1はバリデーション処理がOKの場合の関数、
引数2はバリデーション処理がNGの場合に呼ばれる関数が入ります。

上記コードでは、バリデーション処理がokの処理のみで十分なので、引数は一つにしています。

・formState

フォームの状態をobjectで管理しています。
フォームでエラーになった場合、errors.[項目名]にエラーのobjectが入ります。
上記コードでは、erros.[項目名] && でエラーの場合にメッセージが出るようにしています。

今回つかったのはこんな感じでした!

他にもメソッドや使い方はあるようなのですが
よく使うのはこのあたりだと思うのでまとめました。

また、chakraUIのコンポーネントを使うことで
設定をしなくてもある程度見やすいようになっているので
とても便利です。

これでフォームも楽に書けますね!

Discussion