Material-UIのSelect
にReact Hook Formを次のコードのように導入しました。
import React from 'react';
import { useForm } from 'react-hook-form';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
export default function Form(props) {
const { register, handleSubmit, errors, control } = useForm({
criteriaMode: 'all',
});
return (
<form method="POST">
...
<Select name="select_name" inputRef={register({ required: '入力してください。' })}>
<MenuItem value="1">選択1</MenuItem>
<MenuItem value="2">選択2</MenuItem>
<MenuItem value="3">選択3</MenuItem>
</Select>
...
</form>
);
}
しかし、次のようにエラーが出てしまいます。
index.esm.js:1258 ???? Field is missing `name` attribute {node: input.MuiSelect-nativeInput, value: undefined, focus: ƒ}...
この記事ではMaterial-UIのSelect
にReact Hook Formを導入した際に出るエラーの解決方法を原因をご紹介します。
解決方法はReact Hook FormのController
を使用
Material-UIのSelect
にReact Hook Formを導入するにはReact Hook FormのController
を使用する必要があります。
https://react-hook-form.com/jp/api#Controller
React Hook FormのController
は以下のように使用します。
import React from 'react';
import { useForm } from 'react-hook-form';
import { Controller } from 'react-hook-form';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
export default function Form(props) {
const { register, handleSubmit, errors, control } = useForm({
criteriaMode: 'all',
});
return (
<form method="POST" >
...
<Controller
name="select_name"
control={control}
rules={{required: '入力してください。'}}
render={({ onChange, value, ref }) => (
<Select inputRef={ref} value={value} onChange={(event) => onChange(event.target.value)}>
<MenuItem value="1">選択1</MenuItem>
<MenuItem value="2">選択2</MenuItem>
<MenuItem value="3">選択3</MenuItem>
</Select>
)}
/>
...
</form>
);
}
原因はMaterial-UIのSelect
にinputRefがないから
Material-UIのSelect
に限らずコンポーネントによって、inputRefがありません。
https://material-ui.com/api/select/
そのためReact Hook Formのregister
をMaterial-UIのSelect
が受け付けることができないので、エラーが出てしまいます。
他にもreact-select
や react-datepicker
はinnerRef
または ref
を受け付けることがなくReact Hook Formのregister
は使用できないので、React Hook FormのController
を使用して導入します。
まとめ
Material-UIのSelect
のpropsにはinnerRef
がなく、React Hook Formのregister
を受け入れることができません。
React Hook FormのController
を使用するとMaterial-UIのSelect
でも導入してください。
React Hook FormのController
の使い方は以下のコードの通りです。
import React from 'react';
import { useForm } from 'react-hook-form';
import { Controller } from 'react-hook-form';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
export default function Form(props) {
const { register, handleSubmit, errors, control } = useForm({
criteriaMode: 'all',
});
return (
<form method="POST" >
...
{/* <Select name="select_name" inputRef={register({ required: '入力してください。' })}>
<MenuItem value="1">選択1</MenuItem>
<MenuItem value="2">選択2</MenuItem>
<MenuItem value="3">選択3</MenuItem>
</Select> */}
<Controller
name="select_name"
control={control}
rules={{required: '入力してください。'}} // バリデーション
render={({ onChange, value, ref }) => (
<Select inputRef={ref} value={value} onChange={(event) => onChange(event.target.value)}>
<MenuItem value="1">選択1</MenuItem>
<MenuItem value="2">選択2</MenuItem>
<MenuItem value="3">選択3</MenuItem>
</Select>
)}
/>
...
</form>
);
}
また、Controllerにバリデーションを定義するにはrulesにオブジェクトを入れます。
register
によるバリデーションルール。ローカル状態:更新された検証で
register
入力 ルールまたはuseEffect
での入力をunregister
し、Controller
に更新されたrules
でそれ自体を再登録させます。入力状態:
https://react-hook-form.com/jp/api/#ControllergetValues
でvalidate
関数を活用して、条件付きで検証を返します。
下記に参考書をまとめておきます。
JavaScriptを基礎からしっかり学びたい方におすすめ!
JavaScriptを基礎から応用までガッツリ学びたい方におすすめ!
Reactの概念や仕組みを把握し、開発で使えるReactを学びたい方にオススメ!
コメント