</> useForm:
UseFormProps
useForm
は、フォームを簡単に管理するためのカスタムフックです。オプションの引数として1つのオブジェクトを取ります。次の例では、すべてのプロパティとそのデフォルト値を示します。
汎用プロパティ
オプション | 説明 |
---|---|
mode | 送信する**前**のバリデーション戦略。 |
reValidateMode | 送信する**後**のバリデーション戦略。 |
defaultValues | フォームのデフォルト値。 |
values | フォームの値を更新するためのリアクティブな値。 |
errors | フォームのエラーを更新するためのリアクティブなエラー。 |
resetOptions | 新しいフォーム値を更新する際のフォーム状態更新をリセットするためのオプション。 |
criteriaMode | すべてのバリデーションエラーを表示するか、一度に1つずつ表示するか。 |
shouldFocusError | ビルトインのフォーカス管理を有効または無効にする。 |
delayError | エラーの表示を遅らせる。 |
shouldUseNativeValidation | ブラウザのビルトインフォーム制約APIを使用する。 |
shouldUnregister | アンマウント後の入力の登録解除を有効または無効にする。 |
disabled | 関連するすべての入力と共に、フォーム全体を無効にする。 |
スキーマバリデーションプロパティ
プロパティ
mode: onChange | onBlur | onSubmit | onTouched | all = 'onSubmit' React Native: Controllerと互換性あり
このオプションを使用すると、ユーザーがフォームを送信する前にバリデーション戦略を設定できます。バリデーションは、handleSubmit
関数を呼び出すことでトリガーされるonSubmit
イベント中に発生します。
名前 | 型 | 説明 |
---|---|---|
onSubmit | 文字列 | バリデーションはsubmit イベントでトリガーされ、入力はonChange イベントリスナーをアタッチして自身を再検証します。 |
onBlur | 文字列 | バリデーションはblur イベントでトリガーされます。 |
onChange | 文字列 | 各入力のchange イベントでバリデーションがトリガーされ、複数回の再レンダリングにつながります。警告:これは多くの場合、パフォーマンスに大きな影響を与えます。 |
onTouched | 文字列 | バリデーションは最初にblur イベントでトリガーされます。その後、すべてのchange イベントでトリガーされます。注記: Controller と共に使用する場合、onBlur をrender プロップに接続してください。 |
all | 文字列 | バリデーションはblur イベントとchange イベントの両方でトリガーされます。 |
reValidateMode: onChange | onBlur | onSubmit = 'onChange' React Native: カスタム登録またはControllerの使用
このオプションを使用すると、ユーザーがフォームを送信した後に(onSubmit
イベントとhandleSubmit
関数が実行された後)、エラーのある入力が再検証される際のバリデーション戦略を設定できます。デフォルトでは、再検証は入力変更イベント中に発生します。
defaultValues: FieldValues | () => Promise<FieldValues>
defaultValues
プロップは、フォーム全体をデフォルト値で設定します。同期および非同期のデフォルト値の割り当てをサポートしています。defaultValue
またはdefaultChecked
を使用して入力のデフォルト値を設定できます(公式Reactドキュメントに記載されているとおり)が、フォーム全体にはdefaultValues
を使用することを推奨します。
useForm({defaultValues: {firstName: '',lastName: ''}})// set default value asyncuseForm({defaultValues: async () => fetch('/api-endpoint');})
-
制御されたコンポーネントのデフォルト状態と競合するため、
undefined
をデフォルト値として指定することは避ける必要があります。 -
defaultValues
はキャッシュされます。リセットするには、resetAPIを使用します。 -
defaultValues
はデフォルトで送信結果に含まれます。 -
Moment
やLuxon
など、プロトタイプメソッドを含むカスタムオブジェクトをdefaultValues
として使用することは避けることをお勧めします。 -
フォームデータを含めるための他のオプションがあります。
<input {...register("hidden", { value: "data" })} type="hidden" />// include data onSubmitconst onSubmit = (data) => {const output = {...data,others: "others",}}
values: FieldValues
values
プロップは変更に反応してフォームの値を更新します。これは、フォームを外部の状態またはサーバーデータによって更新する必要がある場合に役立ちます。values
プロップは、resetOptions: { keepDefaultValues: true }
がuseForm
にも設定されていない限り、defaultValues
プロップを上書きします。
// set default value syncfunction App({ values }) {useForm({values, // will get updated when values props updates})}function App() {const values = useFetch("/api")useForm({defaultValues: {firstName: "",lastName: "",},values, // will get updated once values returns})}
errors: FieldErrors
errors
プロップは変更に反応してサーバーエラーの状態を更新します。これは、フォームを外部のサーバーが返したエラーによって更新する必要がある場合に役立ちます。
function App() {const { errors, data } = useFetch("/api")useForm({errors, // will get updated once errors returns})}
resetOptions: KeepStateOptions
このプロパティは、値の更新動作に関連しています。values
またはdefaultValues
が更新されると、内部的にreset
APIが呼び出されます。values
またはdefaultValues
が非同期で更新された後の目的の動作を指定することが重要です。設定オプション自体は、resetメソッドのオプションへの参照です。
// by default asynchronously value or defaultValues update will reset the form valuesuseForm({ values })useForm({ defaultValues: async () => await fetch() })// options to config the behaviour// eg: I want to keep user interacted/dirty value and not remove any user errorsuseForm({values,resetOptions: {keepDirtyValues: true, // user-interacted input will be retainedkeepErrors: true, // input errors will be retained with value update},})
context: object
このコンテキストobject は変更可能であり、resolver の第2引数またはYupバリデーションのコンテキストオブジェクトに挿入されます。 | CodeSandbox |
criteriaMode: firstError | all
| CodeSandbox |
shouldFocusError: boolean = true
true
(デフォルト)に設定されている場合、ユーザーがバリデーションに失敗したフォームを送信すると、エラーのある最初のフィールドにフォーカスが設定されます。
ref
を持つ登録済みフィールドのみが機能します。カスタム登録された入力は適用されません。例:register('test') // 機能しません
- フォーカスの順序は、
register
の順序に基づいています。
delayError: number
この設定は、エラー状態のエンドユーザーへの表示を、指定したミリ秒数遅らせます。ユーザーがエラー入力を修正した場合、エラーは即座に削除され、遅延は適用されません。 | CodeSandbox |
shouldUnregister: boolean = false
デフォルトでは、入力が削除されても入力値は保持されます。ただし、shouldUnregister
を true
に設定して、アンマウント時に入力の登録解除を行うことができます。
-
これはグローバル設定であり、子レベルの設定を上書きします。個々の動作を持たせるには、
useForm
ではなく、コンポーネントまたはフックレベルで設定してください。 -
デフォルトでは、
shouldUnregister: false
は、アンマウントされたフィールドが組み込みの検証によって検証されないことを意味します。 -
useForm
レベルでshouldUnregister
をtrueに設定すると、defaultValues
は送信結果とマージされません。 -
shouldUnregister: true
を設定すると、フォームの動作がネイティブフォームにより近くなります。-
フォームの値は、入力自体に格納されます。
-
入力のアンマウントは、その値を削除します。
-
非表示の入力には、非表示のデータの保存に
hidden
属性を使用する必要があります。 -
登録された入力のみが送信データに含まれます。
-
アンマウントされた入力は、フックフォームがDOMから入力がアンマウントされていることを確認するために、
useForm
またはuseWatch
のuseEffect
で通知する必要があります。const NotWork = () => {const [show, setShow] = React.useState(false)// ❌ won't get notified, need to invoke unregisterreturn show && <input {...register("test")} />}const Work = ({ control }) => {const { show } = useWatch({ control })// ✅ get notified at useEffectreturn show && <input {...register("test1")} />}const App = () => {const [show, setShow] = React.useState(false)const { control } = useForm({ shouldUnregister: true })return (<div>// ✅ get notified at useForm's useEffect{show && <input {...register("test2")} />}<NotWork /><Work control={control} /></div>)}
-
shouldUseNativeValidation: boolean = false
この設定により、ブラウザのネイティブ検証が有効になります。また、CSSセレクター:valid
と:invalid
が有効になり、入力のスタイル設定が容易になります。クライアント側の検証が無効になっている場合でも、これらのセレクターを使用できます。
reportValidity
の実行によってエラー入力にフォーカスが設定されるため、onSubmit
モードとonChange
モードでのみ機能します。- ネイティブに表示するには、登録された各フィールドの検証メッセージは文字列である必要があります。
- この機能は、実際のDOM参照に接続されている
register
APIとuseController/Controller
でのみ機能します。
例
import { useForm } from "react-hook-form"export default function App() {const { register, handleSubmit } = useForm({shouldUseNativeValidation: true,})const onSubmit = async (data) => {console.log(data)}return (<form onSubmit={handleSubmit(onSubmit)}><input{...register("firstName", {required: "Please enter your first name.",})} // custom message/><input type="submit" /></form>)}
disabled: boolean = false
この設定を使用すると、true
に設定した場合、フォーム全体と関連するすべての入力を無効にすることができます。
これは、非同期タスク中または入力が一時的に応答しない必要があるその他の状況で、ユーザーの操作を防止するのに役立ちます。
例
import { useForm, Controller } from "react-hook-form"const App = () => {const [disabled, setDisabled] = useState(false)const { register, handleSubmit, control } = useForm({disabled,})return (<formonSubmit={handleSubmit(async () => {setDisabled(true)await sleep(100)setDisabled(false)})}><inputtype={"checkbox"}{...register("checkbox")}data-testid={"checkbox"}/><select {...register("select")} data-testid={"select"} /><Controllercontrol={control}render={({ field }) => <input disabled={field.disabled} />}name="test"/><button type="submit">Submit</button></form>)}
resolver: Resolver
この関数を使用すると、Yup、Zod、Joi、Vest、Ajvなど、任意の外部検証ライブラリを使用できます。目標は、好みの検証ライブラリをシームレスに統合できるようにすることです。ライブラリを使用していない場合は、独自のロジックを記述してフォームを検証することもできます。
npm install @hookform/resolvers
プロパティ
名前 | 型 | 説明 |
---|---|---|
values | オブジェクト | このオブジェクトには、フォームの値全体が含まれています。 |
context | オブジェクト | これは、useForm の設定に提供できるcontext オブジェクトです。これは、各再レンダリング時に変更できる変更可能なオブジェクト です。 |
オプション | { "criteriaMode": "string", "fields": "object", "names": "string[]" } | これは、検証されたフィールド、名前、およびuseForm からのcriteriaMode に関する情報を含むオプションオブジェクトです。 |
- スキーマ検証は、フィールドレベルのエラーレポートに焦点を当てています。親レベルのエラーチェックは直接の親レベルに限定され、グループチェックボックスなどのコンポーネントに適用されます。
- この関数はキャッシュされます。
- 入力の再検証は、ユーザーの操作中は一度に1つのフィールドのみ発生します。ライブラリ自体は、
error
オブジェクトを評価して、それに応じて再レンダリングをトリガーします。 - リゾルバーは、組み込みのバリデーター(例:required、minなど)と併用することはできません。
- カスタムリゾルバーを作成する場合
values
プロパティとerrors
プロパティの両方を持つオブジェクトを返すようにしてください。それらのデフォルト値は空のオブジェクトにする必要があります。例:{}
。error
オブジェクトのキーは、フィールドのname
値と一致する必要があります。
例
import React from "react"import { useForm } from "react-hook-form"import { yupResolver } from "@hookform/resolvers/yup"import * as yup from "yup"type Inputs = {name: stringage: string}const schema = yup.object().shape({name: yup.string().required(),age: yup.number().required(),}).required()const App = () => {const { register, handleSubmit } = useForm<Inputs>({resolver: yupResolver(schema), // yup, joi and even your own.})return (<form onSubmit={handleSubmit((d) => console.log(d))}><input {...register("name")} /><input type="number" {...register("age")} /><input type="submit" /></form>)}
詳細については、Resolver Documentationを参照してください。
次のコードスニペットを使用して、スキーマをデバッグできます。
resolver: async (data, context, options) => {// you can debug your validation schema hereconsole.log("formData", data)console.log("validation result",await anyResolver(schema)(data, context, options))return anyResolver(schema)(data, context, options)}
戻り値
次のリストには、useForm
の戻り値のプロパティへの参照が含まれています。
- register
- unregister
- formState
- watch
- handleSubmit
- reset
- resetField
- setError
- clearErrors
- setValue
- setFocus
- getValues
- getFieldState
- trigger
- control
- Form
ご支援ありがとうございます。
React Hook Formがプロジェクトで役立つと感じた場合は、スターを付けてサポートをご検討ください。