今回はreactのフォームのバリデーションについてです!
バリデーションはフォームの入力項目が多かったり、バリデーション項目が多くなったりしてくると、どうしても自力で実装するのは大変ですよね。。。そういった時は、ライブラリを検討してみるのはいかがでしょうか?
そこで、今回は、react-hook-formとyupというライブラリを紹介します。
バージョンは以下のようになっています。
・react: 18.2.0
・typescript:5.1.6
・react-hook-form:7.46.1
・yup:1.2.0
これがフォームの機能面を提供してくれるライブラリになります。
これだけでもバリデーションもできますが、こちらのバリデーションだけでは細かいところに手が届きにくかったりするようです。少し試した感じでは提供してくれるバリデーションの種類が少なかったり、Type Scriptで書いた時にresolverと言われるバリデーション時の処理を行う箇所が複雑になりそうでした。
公式:
React Hook Form – performant, flexible and extensible form library
バリデーションの型やメソッドを提供してくれるライブラリです。
以下のyupのページからも分かるようにとても細くバリデーションを行うことができます。
公式:
今回は、簡単に名前とアドレスの入力項目があるフォームを考え、バリデーションを行ってみました。
以下がその時のコードになります。
import * as yup from 'yup';
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
type FormValues = {
name: string;
email: string;
};
// バリデーション用のスキーマを定義する
const schema: yup.ObjectSchema<FormValues> = yup.object({
name: yup.string().required('名前を入力してください'),
email: yup.string().required('メールアドレスを入力してください').email('有効なメールアドレスを入力してください'),
});
export type Form = yup.InferType<typeof schema>;
const Contact = () => {
// react-hook-formのuseFormを使い、フォームに必要な関数や変数などを定義をする
// このuseFormの引数に上で定義をしたスキーマを渡してあげる
const { register, handleSubmit, formState: { errors } } = useForm({ resolver: yupResolver(schema) });
const onSubmit = (data: Form) => console.log(data);
return (
<main>
<div>お問い合わせ</div>
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<label htmlFor="email">Email</label>
// inputタグに上で定義したregisterを展開してあげる。特にここで自分でonChangeやvalueなどを書いてあげる必要はない。
<input id="email" {...register('email')} />
// このerrorsにエラーの状態が入っている
{errors?.email && <div>{errors.email.message}</div>}
</div>
<div>
<label htmlFor="name">お名前</label>
<input id="name" {...register('name')} />
{errors?.name && <div>{errors.name.message}</div>}
</div>
<button type="submit">送信</button>
</form>
</main>
)
}
export default Contact;
これで試しに未入力のままを送信ボタンを押すと、バリデーションのルールに従って以下のようにエラー表示となります。
react-hook-formとyupを使って、バリデーションを簡単に実装することができます。
また、可読性の高いコードになると思いますので、ぜひフォームを作成してバリデーションをするときは使っていきたいですね!
NEXTGATE LiSMOtechでは中小企業を中心にブランディング・WEBマーケティングを活用したWEB戦略を提供しています。
企業課題・問題に関するご相談、WEBサイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。
平日10:00〜19:00
© NEXTGATE LiSMOtech All rights reserved