</> Controller
: コンポーネント
React Hook Formは非制御コンポーネントとネイティブ入力を採用していますが、React-Select、AntD、MUIなどの外部制御コンポーネントを使用せざるを得ない場合もあります。このラッパーコンポーネントを使用すると、それらとの連携が容易になります。
プロパティ
次の表に、Controller
の引数に関する情報を示します。
名前 | 型 | 必須 | 説明 |
---|---|---|---|
name | FieldPath | ✓ | 入力の一意の名前。 |
control | Control | control オブジェクトは、useForm を呼び出すことで取得されます。FormProvider を使用する場合はオプションです。 | |
render | 関数 | これはレンダープロップです。React要素を返し、イベントと値をコンポーネントにアタッチする機能を提供します。これにより、非標準のプロパティ名を持つ外部制御コンポーネントとの統合が簡素化されます。子コンポーネントにonChange 、onBlur 、name 、ref 、value を提供し、特定の入力状態を含むfieldState オブジェクトも提供します。 | |
defaultValue | unknown | 重要: useForm のdefaultValue またはdefaultValues にはundefined を適用できません。
| |
rules | オブジェクト | register オプションと同じ形式の検証ルール。これには以下が含まれます。required, min, max, minLength, maxLength, pattern, validate | |
shouldUnregister | boolean = false` | アンマウント後にInputが登録解除され、defaultValuesも削除されます。 注記: useFieldArray で使用する場合、このプロップは避けるべきです。unregister 関数はInputのアンマウント/リマウントと並べ替え後に呼び出されます。 | |
disabled | boolean = false` | disabled プロップはfield プロップから返されます。制御された入力は無効になり、その値は送信データから省略されます。 |
戻り値
次の表に、Controller
が生成するプロパティに関する情報を示します。
オブジェクト名 | 名前 | 型 | 説明 |
---|---|---|---|
field | onChange | (value: any) => void | 入力の値をライブラリに送信する関数。 入力の onChange プロップに割り当てる必要があり、値はundefined であってはなりません。 このプロパティはformStateを更新します。フィールドの更新に関連するsetValueやその他のAPIを手動で呼び出すのは避けてください。 |
field | onBlur | () => void | 入力のonBlurイベントをライブラリに送信する関数。入力のonBlur プロップに割り当てる必要があります。 |
field | value | unknown | 制御されたコンポーネントの現在の値。 |
field | disabled | boolean | 入力の無効状態。 |
field | name | string | 登録されている入力の名前。 |
field | ref | React.ref | フックフォームを入力に接続するために使用されるref。ref をコンポーネントの入力refに割り当てて、フックフォームがエラー入力をフォーカスできるようにします。 |
fieldState | invalid | boolean | 現在の入力の無効状態。 |
fieldState | isTouched | boolean | 現在の制御された入力のタッチ状態。 |
fieldState | isDirty | boolean | 現在の制御された入力のダーティ状態。 |
fieldState | error | object | この特定の入力のエラー。 |
formState | isDirty | boolean | ユーザーが入力内容を変更した後、true に設定されます。
|
formState | dirtyFields | object | ユーザーが変更したフィールドを含むオブジェクト。すべての入力のdefaultValues をuseForm を介して提供して、ライブラリがdefaultValues と比較できるようにしてください。
|
formState | touchedFields | object | ユーザーが操作したすべての入力を含むオブジェクト。 |
formState | defaultValues | object | useFormのdefaultValues で設定された値、またはresetAPIを介して更新されたdefaultValues 。 |
formState | isSubmitted | boolean | フォームが送信された後、true に設定されます。reset メソッドが呼び出されるまでtrue のままです。 |
formState | isSubmitSuccessful | boolean | ランタイムエラーなしでフォームが正常に送信されたことを示します。 |
formState | isSubmitting | boolean | フォームが現在送信中の場合はtrue 。それ以外の場合はfalse 。 |
formState | isLoading | boolean | フォームが現在非同期デフォルト値を読み込んでいる場合はtrue 。重要: このプロップは非同期 defaultValues にのみ適用されます。 |
formState | submitCount | number | フォームが送信された回数。 |
formState | isValid | boolean | フォームにエラーがない場合、true に設定されます。setError はisValid formStateに影響を与えません。isValid は常にフォーム全体の検証結果から導出されます。 |
formState | isValidating | boolean | 検証中はtrue に設定されます。 |
formState | errors | object | フィールドエラーを含むオブジェクト。エラーメッセージを簡単に取得するためのErrorMessageコンポーネントもあります。 |
例
ウェブ
import ReactDatePicker from "react-datepicker"import { TextField } from "@material-ui/core"import { useForm, Controller } from "react-hook-form"type FormValues = {ReactDatepicker: string}function App() {const { handleSubmit, control } = useForm<FormValues>()return (<form onSubmit={handleSubmit((data) => console.log(data))}><Controllercontrol={control}name="ReactDatepicker"render={({ field: { onChange, onBlur, value, ref } }) => (<ReactDatePickeronChange={onChange} // send value to hook formonBlur={onBlur} // notify when input is touched/blurselected={value}/>)}/><input type="submit" /></form>)}
React Native
import { Text, View, TextInput, Button, Alert } from "react-native"import { useForm, Controller } from "react-hook-form"export default function App() {const {control,handleSubmit,formState: { errors },} = useForm({defaultValues: {firstName: "",lastName: "",},})const onSubmit = (data) => console.log(data)return (<View><Controllercontrol={control}rules={{required: true,}}render={({ field: { onChange, onBlur, value } }) => (<TextInputplaceholder="First name"onBlur={onBlur}onChangeText={onChange}value={value}/>)}name="firstName"/>{errors.firstName && <Text>This is required.</Text>}<Controllercontrol={control}rules={{maxLength: 100,}}render={({ field: { onChange, onBlur, value } }) => (<TextInputplaceholder="Last name"onBlur={onBlur}onChangeText={onChange}value={value}/>)}name="lastName"/><Button title="Submit" onPress={handleSubmit(onSubmit)} /></View>)}
ビデオ
次のビデオでは、Controllerの内側と、その構築方法を紹介しています。
ヒント
-
MUI、AntD、Chakra UIなどの外部制御コンポーネントを使用する際には、各プロップの役割を理解することが重要です。コントローラーは、値を報告および設定することで、入力に対する「監視役」として機能します。
- onChange: データをフックフォームに送り返します
- onBlur: 入力が操作されたことを報告します(フォーカスとブラー)
- value: 入力の初期値と更新された値を設定します
- ref: エラーが発生した場合に入力にフォーカスできるようにします
- name: 入力に一意の名前を付けます。以下のCodesandboxが使用方法を示しています。
- MUIおよびその他のコンポーネント
- Chakra UIコンポーネント
-
入力を再度
register
しないでください。このコンポーネントは登録プロセスを処理するように作られています。<Controllername="test"render={({ field }) => {// return <input {...field} {...register('test')} />; ❌ double up the registrationreturn <input {...field} /> // ✅}}/> -
onChange
中に値を変換することで、フックフォームに送信される値をカスタマイズします。<Controllername="test"render={({ field }) => {// sending integer instead of string.return (<input{...field}onChange={(e) => field.onChange(parseInt(e.target.value))}/>)}}/>
ご支援ありがとうございます
React Hook Formがプロジェクトで役立つと感じた場合は、スターをつけてサポートをご検討ください。