💭
React Hook FormとMUIコンポーネントの連携
目的
React Hook Form で MUI コンポーネントとの連携方法をまとめます。
基本的に React Hook Form(以下 rhf)と MUI の連携方法は以下のブログを参考にController
を通して行っていきます。
Integrating with UI libraries
rhf の詳しい使い方や MUI については各種ドキュメントや他の記事を参考にしてください。
メモ
下準備
useForm
以下のコードでcontrol
を用意します。
const {control} = useForm()
string 以外の値を rhf に登録したいとき
Controller
などの render props で渡される onChange プロパティに、event から取得した値を任意の型、例えば数値であれば文字列でわたってくるのでparseInt
などで変換した値を onChange 関数の引数に渡してあげれば任意の型で rhf に登録できます。
Checkbox
<Controller
name="textFieldValue"
control={control}
render={({ field }) => <TextField type="number" {...field} onChange={(event) => field.onChange(parseInt(event.currentTarget.value))} />}
/>
RadioGroup
<Controller
name="radioGroupValue"
control={control}
render={({ field }) => (
<FormControl>
<RadioGroup {...field}>
<FormControlLabel value="female" control={<Radio />} label="女性" />
<FormControlLabel value="male" control={<Radio />} label="男性" />
<FormControlLabel value="other" control={<Radio />} label="その他" />
</RadioGroup>
</FormControl>
)}
/>
value を文字列以外にしたい場合。今回は boolean を管理する方法。
<Controller
name="radioGroupFlag"
control={control}
render={({ field }) => (
<FormControl>
<RadioGroup {...field} onChange={(event) => field.onChange(event?.currentTarget.value === "true")}>
<FormControlLabel value={true} control={<Radio />} label="有効" />
<FormControlLabel value={false} control={<Radio />} label="無効" />
</RadioGroup>
</FormControl>
)}
/>
Select
<Controller
name="selectValue"
control={control}
render={({ field }) => (
<Select {...field} displayEmpty>
<MenuItem value=""><em>なし</em></MenuItem>
<MenuItem value="female">女性</MenuItem>
<MenuItem value="male">男性</MenuItem>
<MenuItem value="other">その他</MenuItem>
</Select>
)}
/>
TextField
<Controller
name="textFieldValue"
control={control}
render={({field}) => <TextField {...field} />}
/>
上記は値が文字列の場合だが、type="number"
を指定した場合などは onChange に変換後の値を渡してやれば Form にはnumber
が登録される。
<Controller
name="textFieldValue"
control={control}
render={({ field }) => <TextField type="number" {...field} onChange={(event) => field.onChange(parseInt(event.currentTarget.value))} />}
/>
終わりに
今回は React Hook Form と MUI の連携についてよく使うコンポーネントで連携方法をまとめてみました。
もしこういう方法もあるよ、やこのコンポーネントはこうやって連携できるよなどあればコメントをいただけると嬉しいです。
今回作成したコードのサンプルは以下のリポジトリにおいておきます。
https://github.com/tamago0224/react-hook-form-mui
Discussion