0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

react5 validation

Posted at

はじめに

フロントでバリデーションを行いたい。
reactを使っている。

検証要件

名前を10文字以内
メールアドレスは適切な形式
パスワードは6文字以上
そして上の三つは必須項目。
適当にこんな感じ。

以上の要件に合わない場合はapiを叩かないようにしたい。
react-hook-formというライブラリを使う記事が多かったので参考にした。
しかし、皆typescriptで書いてて理解しづらい、、、
そこで公式を軽く読んで使い方を理解。
https://react-hook-form.com/get-started

やりたいことはさっきの要件の検証とエラー文の出力。
エラー文のレンダリングには@hookform/error-messageライブラリを使用したらOK。
https://www.npmjs.com/package/@hookform/error-message

実践

import { useForm } from "react-hook-form";
import { ErrorMessage } from '@hookform/error-message';
const UserCreate = () => {
    const URL = "http://localhost:8080/post"
    const { register, handleSubmit , formState: { errors }} = useForm();
    const postData = (data) => {
        fetch(URL,
        {
        method: 'POST',
        headers:{'Content-Type': 'application/json'},
        body: JSON.stringify(data)
    }
        )
            .then(() => {
            console.log("success")
            })
            .catch((error) => {
            console.error(error)
            })
        
    }
    return (
        <div>
            <form onSubmit={handleSubmit(postData)}>
                <div>
                    <label>
                        名前:
                        <input
                            {...register("username", {
                                required: "入力必須",
                                maxLength: {
                                    value: 10,
                                    message:"10文字以内"   
                                }
                            })} />
                    </label>
                    <div>
                        <ErrorMessage name="username" errors={errors}/>
                    </div>
                </div>
                <div>
                    <label>
                        メール:
                        <input
                            {...register("email", {
                                required: "入力必須",
                                pattern: {
                                    value: /^[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$/,
                                    message:"入力形式が適切ではありません。"
                                }
                            })} />
                    </label>
                    <div>
                        <ErrorMessage name="email" errors={errors}/>
                    </div>
                </div>
                <div>
                    <label>
                        パスワード:
                        <input
                            {...register("password", {
                                required: "入力必須",
                                minLength: {
                                    value: 6,
                                    message:"6文字以上"
                                }
                            })} />
                    </label>
                    <div>
                        <ErrorMessage name="password" errors={errors} />
                    </div>
                </div>
                <input type="submit" value="送信" />
            </form>
        </div>
    )
}
export default UserCreate

参考↓
https://qiita.com/NozomuTsuruta/items/60d15d97eeef71993f06

解説

基本的にはそこまで使い方に癖は感じなかった。
要はformタグにonSubmitを仕込むのは同じ。
inputタグにonChangeを仕込む手間が減った。
さらにstateを定義する必要がなくなった。
これはregister,handleSubmitのおかげ!
handleSubmitでformのデータをラップした関数(postData)に渡してくれる。これでonChangeで変更した内容をuseStateの更新関数でstateの値を変更せずに済む。
registerはformの値を管理。
構文としては

<input {...register("state名", {検証したい内容})} />

こんな感じなのかな。
具体的に検証して蹴られた場合のエラー文は
requiredはブール値で必須か否かを表す。デフォではfalseなのでtrueとしたら必須項目となる。
さらにtrueの代わりに表示したいエラーメッセージを書くことで必須項目かつエラーメッセージを設定できる。
その他に、文字数制限はminLengthとか色々とあるので公式をチェック。
メールアドレスの場合は正規表現で形式があっているか検証している。
その際のエラーメッセージはvalueとして設定している。

それに対をなすように検証からはじかれた場合のエラー文を表示させるのが

<ErrorMessage name="state名" errors={errors}/>

以前の記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?