React Hook Form と MUI を使うときに setFocus が動作しない
mui
react
javascript
typescript
投稿日: 2024/06/26
React Hook FormはSubmit時にバリデーションエラーのあるフィールドに自動でフォーカスしてくれます。
しかし、React Hook Form と MUI を連携させてるときにそれが動作しなかったので、その小ネタ。
その時のコードが以下のコードです。
setFocus が動作しません。
このコードには問題があります。
<Controller name="title" control={control} rules={{ required: "入力してください。", maxLength: { value: 150, message: "最大150文字です", }, }} render={({ field, fieldState }) => ( <TextField {...field} fullWidth multiline error={fieldState.invalid} helperText={fieldState.error?.message} /> )} />
解決方法としてはfield
からref
を除外し、除外したref
をinputRef
に渡します。
よい例
<Controller name="title" control={control} rules={{ required: "入力してください。", maxLength: { value: 150, message: "最大150文字です", }, }} render={({ field: { ref, ...field }, fieldState }) => ( <TextField {...field} inputRef={ref} fullWidth multiline error={fieldState.invalid} helperText={fieldState.error?.message} /> )} />
解説するほどでもないですが、MUIでは装飾のためにTextField
などは純粋なtextarea
やinput
タグではありません。textarea
やinput
タグをdiv
で囲ったコンポーネントになってます。
field
をそのままTextField
に渡すと、div
タグのref
が変更されてtextarea
やinput
タグのref
は変更されません。
MUIはtextarea
やinput
タグにアクセスする方法を提供してくれていて、それがinputRef
というわけです。