コンテンツへスキップ

コントローラー

制御された入力のためのラッパーコンポーネント

</> Controller: コンポーネント

React Hook Formは非制御コンポーネントとネイティブ入力を採用していますが、React-SelectAntDMUIなどの外部制御コンポーネントを使用せざるを得ない場合もあります。このラッパーコンポーネントを使用すると、それらとの連携が容易になります。

プロパティ


次の表に、Controllerの引数に関する情報を示します。

名前必須説明
nameFieldPath入力の一意の名前。
controlControlcontrolオブジェクトは、useFormを呼び出すことで取得されます。FormProviderを使用する場合はオプションです。
render関数これはレンダープロップです。React要素を返し、イベントと値をコンポーネントにアタッチする機能を提供します。これにより、非標準のプロパティ名を持つ外部制御コンポーネントとの統合が簡素化されます。子コンポーネントにonChangeonBlurnamerefvalueを提供し、特定の入力状態を含むfieldStateオブジェクトも提供します。
defaultValueunknown重要: useFormdefaultValueまたはdefaultValuesにはundefinedを適用できません。
  • フィールドレベルでdefaultValueを設定するか、useFormdefaultValuesを設定する必要があります。undefinedは無効な値です。
  • フォームがデフォルト値でresetを呼び出す場合、useFormdefaultValuesを提供する必要があります。
  • undefinedonChangeを呼び出すのは無効です。代わりにnullまたは空文字列をデフォルト/クリアされた値として使用してください。
rulesオブジェクトregisterオプションと同じ形式の検証ルール。これには以下が含まれます。

required, min, max, minLength, maxLength, pattern, validate
shouldUnregisterboolean = false`アンマウント後にInputが登録解除され、defaultValuesも削除されます。

注記: useFieldArrayで使用する場合、このプロップは避けるべきです。unregister関数はInputのアンマウント/リマウントと並べ替え後に呼び出されます。
disabledboolean = false`disabledプロップはfieldプロップから返されます。制御された入力は無効になり、その値は送信データから省略されます。

戻り値


次の表に、Controllerが生成するプロパティに関する情報を示します。

オブジェクト名名前説明
fieldonChange(value: any) => void入力の値をライブラリに送信する関数。

入力のonChangeプロップに割り当てる必要があり、値はundefinedであってはなりません
このプロパティはformStateを更新します。フィールドの更新に関連するsetValueやその他のAPIを手動で呼び出すのは避けてください。
fieldonBlur() => void入力のonBlurイベントをライブラリに送信する関数。入力のonBlurプロップに割り当てる必要があります。
fieldvalueunknown制御されたコンポーネントの現在の値。
fielddisabledboolean入力の無効状態。
fieldnamestring登録されている入力の名前。
fieldrefReact.refフックフォームを入力に接続するために使用されるref。refをコンポーネントの入力refに割り当てて、フックフォームがエラー入力をフォーカスできるようにします。
fieldStateinvalidboolean現在の入力の無効状態。
fieldStateisTouchedboolean現在の制御された入力のタッチ状態。
fieldStateisDirtyboolean現在の制御された入力のダーティ状態。
fieldStateerrorobjectこの特定の入力のエラー。
formStateisDirtybooleanユーザーが入力内容を変更した後、trueに設定されます。
  1. 重要: すべての入力のdefaultValuesuseFormで提供して、フォームがダーティかどうかを比較するための単一の真実のソースをフックフォームが持つようにしてください。
  2. ファイルタイプの入力は、ファイルの選択をキャンセルできることとFileListオブジェクトのために、アプリレベルで管理する必要があります。
formStatedirtyFieldsobjectユーザーが変更したフィールドを含むオブジェクト。すべての入力のdefaultValuesuseFormを介して提供して、ライブラリがdefaultValuesと比較できるようにしてください。
  1. 重要: すべての入力のdefaultValuesuseFormで提供して、各フィールドのダーティ状態を比較するための単一の真実のソースをフックフォームが持つようにしてください。
  2. ダーティフィールドは、isDirty formStateとしては表現されません。なぜなら、ダーティフィールドはフォーム全体ではなくフィールドレベルでダーティフィールドとしてマークされるからです。フォーム全体の状態を確認したい場合は、代わりにisDirtyを使用してください。
formStatetouchedFieldsobjectユーザーが操作したすべての入力を含むオブジェクト。
formStatedefaultValuesobjectuseFormdefaultValuesで設定された値、またはresetAPIを介して更新されたdefaultValues
formStateisSubmittedbooleanフォームが送信された後、trueに設定されます。resetメソッドが呼び出されるまでtrueのままです。
formStateisSubmitSuccessfulbooleanランタイムエラーなしでフォームが正常に送信されたことを示します。
formStateisSubmittingbooleanフォームが現在送信中の場合はtrue。それ以外の場合はfalse
formStateisLoadingbooleanフォームが現在非同期デフォルト値を読み込んでいる場合はtrue
重要: このプロップは非同期defaultValuesにのみ適用されます。
formStatesubmitCountnumberフォームが送信された回数。
formStateisValidbooleanフォームにエラーがない場合、trueに設定されます。

setErrorisValid formStateに影響を与えません。isValidは常にフォーム全体の検証結果から導出されます。
formStateisValidatingboolean検証中はtrueに設定されます。
formStateerrorsobjectフィールドエラーを含むオブジェクト。エラーメッセージを簡単に取得するための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))}>
<Controller
control={control}
name="ReactDatepicker"
render={({ field: { onChange, onBlur, value, ref } }) => (
<ReactDatePicker
onChange={onChange} // send value to hook form
onBlur={onBlur} // notify when input is touched/blur
selected={value}
/>
)}
/>
<input type="submit" />
</form>
)
}
import React from "react"
import ReactDatePicker from "react-datepicker"
import { TextField } from "@material-ui/core"
import { useForm, Controller } from "react-hook-form"
function App() {
const { handleSubmit, control } = useForm()
return (
<form onSubmit={handleSubmit((data) => console.log(data))}>
<Controller
control={control}
name="ReactDatepicker"
render={({ field: { onChange, onBlur, value, ref } }) => (
<ReactDatePicker
onChange={onChange}
onBlur={onBlur}
selected={value}
/>
)}
/>
<input type="submit" />
</form>
)
}

React Native

Expo JS
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>
<Controller
control={control}
rules={{
required: true,
}}
render={({ field: { onChange, onBlur, value } }) => (
<TextInput
placeholder="First name"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="firstName"
/>
{errors.firstName && <Text>This is required.</Text>}
<Controller
control={control}
rules={{
maxLength: 100,
}}
render={({ field: { onChange, onBlur, value } }) => (
<TextInput
placeholder="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しないでください。このコンポーネントは登録プロセスを処理するように作られています。

    <Controller
    name="test"
    render={({ field }) => {
    // return <input {...field} {...register('test')} />; ❌ double up the registration
    return <input {...field} /> // ✅
    }}
    />
  • onChange中に値を変換することで、フックフォームに送信される値をカスタマイズします。

    <Controller
    name="test"
    render={({ field }) => {
    // sending integer instead of string.
    return (
    <input
    {...field}
    onChange={(e) => field.onChange(parseInt(e.target.value))}
    />
    )
    }}
    />

ご支援ありがとうございます

React Hook Formがプロジェクトで役立つと感じた場合は、スターをつけてサポートをご検討ください。