Noh | エンジニア向け情報共有コミュニティ
Signup / Login

React Hook Form と MUI を使うときに setFocus が動作しない

mui
react
javascript
typescript

投稿日: 2024/06/26

MUI (旧 material-ui )の実用小ネタ集

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を除外し、除外したrefinputRefに渡します。

よい例

<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などは純粋なtextareainputタグではありません。textareainputタグをdivで囲ったコンポーネントになってます。

fieldをそのままTextFieldに渡すと、divタグのrefが変更されてtextareainputタグのrefは変更されません。
MUIはtextareainputタグにアクセスする方法を提供してくれていて、それがinputRefというわけです。

参考: https://github.com/react-hook-form/react-hook-form/issues/5947

yosi

Noh を作ってるエンジニア。

目次