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というわけです。
