React Hook FormをMUIで使用してみた。
に公開
React Hook FormをMUIで使用した時のメモ。
今回はMUIの「TextField」と「CheckBox」に関して考えていきます。
・型を用意
まずはInputの型を定義
// TextFieldでtitleをCheckBoxでimportantを入力
type Inputs = {
title: string;
important: boolean;
};
// keyの配列も事前に用意しておく
type InputsKeys = Array<keyof Inputs>;
・関数などの準備
まずはuseFormから必要なものを使用できるようにしておく
const {
getValues,
control,
handleSubmit,
unregister,
formState: {
errors: formErrors, isDirty, dirtyFields
}
} = useForm<Inputs>({
defaultValues: {
title: "React-Hook-FomeとMUI",
important: true,
}
});
getValues - 入力した値を取得
control - タブ内で使用
handleSubmit - submitの際に使用
unregister - 入力した値を削除する際に使用
isDirty - 入力に変更があるかのチェック(全体)
dirtyFields - 入力に変更があるかのチェック(個別)
defaultValues - 初期値を設定
・バリデーションを用意
const validationRules = {
title: {
required: '名前を入力してください',
minLength: { value: 4, message: '4文字以上で入力してください。' }
},
};
・フォームの中身
<Stack m={4} component="form" novalidate onSubmit={handleSubmit(onSubmit)}>
<Box>
// ControllerでTextFieldをラップする
<Controller
name="title"
control={control}
rules={balidationRules.title}
// {field , fieldState}を引数にする
render={({ field, fieldState }) => (
<TextField
{...field}
type="text"
label="タイトル"
// fieldState.invalidは非推奨のようです。
error={fieldState.invalid}
helperText={fieldState.error?.message}
/>
)}
/>
</Box>
// ControllerでCheckBoxをラップ
<Box mt={2}>
<Controller
name="important"
control={control}
render={({ field }) => <FormControlLabel label="重要" {...field} control={<Checkbox />} />}
/>
</Box>
// 送信ボタン
<Button variant="contained" type="submit">
送信
</Box>
</Stack>
・onSubmit
// dataで全てに入力値を確認できる
const onSubmit = (data: Inputs) => {
// 取得した値を確認できる
console.log(data);
};
もし画面遷移せずに送信と同時に入力した値を消去したいときは
const key = Object.keys(data) as InputsKeys;
// keyには入力値のkeyが配列で入る。
unregister(key, {keepDirty: false});