今回はreact-hook-form
を用いてフォームのバリデーションを行ってみたいと思います。
Performant, flexible and extensible forms with easy-to-use validation.
性能、柔軟性、拡張性に優れたフォームと、使いやすいバリデーション。
インストール
npm install react-hook-form
使い方
import { useForm, SubmitHandler} from 'react-hook-form' type Inputs = { username: string password: string } export const App = () => { const { register, handleSubmit, formState: { errors } } = useForm<Inputs>(); const onSubmit: SubmitHandler<Inputs> = data => { console.log(data); } return ( <div> {/* onSubmitを呼び出す前に、handleSubmitにより入力のバリデーションを行う */} <form onSubmit={handleSubmit(onSubmit)}> {/* inputを"register"関数によりフックに登録する requiredをtrueに設定して必ず入力させる*/} <input {...register("username", { required: true })} /> { /* usernameの入力でエラーがあった場合に文字列を表示する */ errors.username && <span>usernameは必ず入力してください</span> } <input {...register("password", { required: true })} /> {errors.password && <span>passwordは必ず入力してください</span>} {/* 送信ボタン typeにsubmitを設定する */} <input type="submit" /> </form> </div> ) } export default App;
このようにコードを書くことで、username
とpassword
をそれぞれ入力しないと警告文を出力され、onSubmit
が呼ばれないようにすることができます。
バリデーションルールによってエラー文を変える
<input {...register("username", { required: '入力してください', minLength: { value: 3, message: `3文字以上で入力してください`}, maxLength: { value: 10, message: `10文字以内で入力してください` }, pattern: { value: /^[a-zA-Z0-9]+$/, message: '半角英数字で入力してください' } })} /> { errors.username && errors.username.message }
それぞれmessage
を書き込み、エラー文をerrors.[registerした文字列].message
にすることで実現できます。
代表的なバリデーションルール
required
: 入力する必要があるかmin
: 数値の最小数max
: 数値の最大数minLength
: 最小文字数maxLength
: 最大文字数pattern
: 定義する正規表現に従っているか
Get Started
Client-side form validation - Learn web development | MDN