Open4
react-hook-formでフォームの構築

参考資料
-
React Hook Formの基本を理解してフォームを作成してみよう | アールエフェクト
- 基本的な使い方について
-
React Hook Formでフォームに初期値を非同期で与える | DevelopersIO
- 非同期で初期値を与える方法
- [【react-hook-form】React×TypeScript×chakraUI/useFormを使ってバリデーションを実装しよう]
(https://zenn.dev/seetsuko/articles/aaaacdd7a2ac27)- UIについて

公式Get Startedのサンプル
import { useForm, SubmitHandler } from "react-hook-form"
type Inputs = {
example: string
exampleRequired: string
}
export default function App() {
const {
register,
handleSubmit,
watch,
formState: { errors },
} = useForm<Inputs>()
const onSubmit: SubmitHandler<Inputs> = (data) => console.log(data)
console.log(watch("example")) // watch input value by passing the name of it
return (
/* "handleSubmit" will validate your inputs before invoking "onSubmit" */
<form onSubmit={handleSubmit(onSubmit)}>
{/* register your input into the hook by invoking the "register" function */}
<input defaultValue="test" {...register("example")} />
{/* include validation with required or other standard HTML validation rules */}
<input {...register("exampleRequired", { required: true })} />
{/* errors will return when field validation fails */}
{errors.exampleRequired && <span>This field is required</span>}
<input type="submit" />
</form>
)
}
基本の使い方
useForm
のHooksを使って取得したregisterとhandleSubmitを使う。watch
とformState
は必須ではない。
const {
register,
handleSubmit,
watch,
formState: { errors },
} = useForm<Inputs>()
以下のように{...register}
をinput要素で呼ぶことで、入力された値を記録できるようになる。
handleSubmit
をかましてonSubmitやonClickなどのフォーム入力時に呼びたい関数を呼ぶ。
const {
register,
handleSubmit,
} = useForm<Inputs>()
const onSubmit: SubmitHandler<Inputs> = (data) => console.log(data)
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("example")} />
<input {...register("exampleRequired")} />
<input type="submit" />
</form>
)

初期値の設定
useForm
でdefaultValuesを設定するか、inputで直接定義することで初期値を設定できる
# useFormで定義
const {
register,
handleSubmit,
} = useForm<Inputs>({
defaultValues: {
title: "title",
description: "description",
}
})
...
# inputに直接定義
<input defaultValue="test" {...register("example")} />

Validation
register
でvalidationの定義をすることで、handleSubmit
押下時にValidationを行うことができる。
<input {...register("exampleRequired", { required: true })} />
validationの結果に応じて表示を変更をする場合などはerrorの状態を保持するためformState
の定義をまず行う。
formStateで定義したerrors
の値に応じてValidationErrorの内容などのUIを出し分けすればOK
export default function App() {
const {
...
formState: { errors },
} = useForm<Inputs>()
...
<input {...register("exampleRequired", { required: true })} />
{errors.exampleRequired && <span>This field is required</span>}