コンテンツへスキップ

formState

フォームの状態

formState: オブジェクト

このオブジェクトには、フォームの状態に関する情報がすべて含まれています。ユーザーがフォームアプリケーションとどのように対話しているかを追跡するのに役立ちます。

戻り値

名前説明
isDirtyboolean

ユーザーがいずれかの入力を変更した後、true に設定されます。

  • 重要: useForm で全ての入力の defaultValues を指定してください。そうすることで、フックフォームはフォームがダーティかどうかを比較するための単一の真実のソースを持つことができます。

    const {
    formState: { isDirty, dirtyFields },
    setValue,
    } = useForm({ defaultValues: { test: "" } });
    // isDirty: true
    setValue('test', 'change')
    // isDirty: false because there getValues() === defaultValues
    setValue('test', '')
  • ファイル型の入力は、ファイルの選択をキャンセルする機能があるため、アプリレベルで管理する必要があります。 FileList オブジェクト。

  • カスタムオブジェクト、クラス、またはファイルオブジェクトはサポートしていません。

dirtyFieldsオブジェクト

ユーザーが変更したフィールドを持つオブジェクト。 useForm 経由で全ての入力の defaultValues を指定してください。そうすることで、ライブラリは defaultValues と比較することができます。

  • 重要: useForm で defaultValues を指定してください。そうすることで、フックフォームは各フィールドのダーティさを比較するための単一の真実のソースを持つことができます。

  • ダーティフィールドは、 フォーム全体ではなくフィールドレベルでダーティとしてマークされるため、isDirty formState として表現されません。フォーム全体の状態を判断する場合は、代わりに isDirty を使用してください。

touchedFieldsオブジェクトユーザーが対話したすべての入力を含むオブジェクト。
defaultValuesオブジェクト

defaultValues に設定されている値 useForm または、reset API を介して更新された defaultValues。 reset API。

isSubmittedbooleanフォームが送信された後、true に設定されます。reset メソッドが呼び出されるまで、true のままになります。 true until the reset method is invoked.
isSubmitSuccessfulboolean

ランタイムエラーなしでフォームが正常に送信されたことを示します。

isSubmittingbooleanフォームが現在送信中の場合は true それ以外の場合は false
isLoadingboolean

フォームが非同期のデフォルト値をロード中の場合は true

重要: このプロパティは、非同期の defaultValues にのみ適用されます。

const {
formState: { isLoading }
} = useForm({
defaultValues: async () => await fetch('/api')
});
submitCountnumberフォームが送信された回数。
isValidboolean
フォームにエラーがない場合は、true に設定されます。

setErrorisValid formState に影響を与えません。 isValid は常にフォーム全体の検証結果から導き出されます。

isValidatingboolean検証中に true に設定されます。
validatingFieldsboolean非同期検証を取得しているフィールドをキャプチャします。
errorsオブジェクトフィールドエラーを持つオブジェクト。エラーメッセージを簡単に取得するための ErrorMessage コンポーネントもあります。

ルール

  • formState Proxy でラップされており、レンダリングパフォーマンスを向上させ、特定の状態がサブスクライブされていない場合に余分なロジックをスキップします。したがって、状態の更新を有効にするために、render の前に呼び出すか読み取るようにしてください。

  • formState はバッチで更新されます。 useEffect を介して formState をサブスクライブする場合は、オプションの配列に formState 全体を配置してください。

    useEffect(() => {
    if (formState.errors.firstName) {
    // do the your logic here
    }
    }, [formState]); // ✅
    // ❌ formState.errors will not trigger the useEffect
    import { useForm } from "react-hook-form";
    export default function App () {
    const {
    register,
    handleSubmit,
    formState
    } = useForm();
    const onSubmit = (data) => console.log(data);
    React.useEffect(() => {
    console.log("touchedFields", formState.touchedFields);
    },[formState]); // use entire formState object as optional array arg in useEffect, not individual properties of it
    return (
    <form onSubmit={handleSubmit(onSubmit)}>
    <input {...register("test")} />
    <input type="submit" />
    </form>
    );
    };
  • サブスクリプション時の論理演算子に注意してください。 formState.

    // ❌ formState.isValid is accessed conditionally,
    // so the Proxy does not subscribe to changes of that state
    return <button disabled={!formState.isDirty || !formState.isValid} />;
    // ✅ read all formState values to subscribe to changes
    const { isDirty, isValid } = formState;
    return <button disabled={!isDirty || !isValid} />;

CodeSandbox JS
import React from "react";
import { useForm } from "react-hook-form";
export default function App() {
const {
register,
handleSubmit,
// Read the formState before render to subscribe the form state through the Proxy
formState: { errors, isDirty, isSubmitting, touchedFields, submitCount },
} = useForm();
const onSubmit = (data) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("test")} />
<input type="submit" />
</form>
);
}

動画

次の動画では、さまざまなフォームの状態について詳しく説明します。

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

もしReact Hook Formがプロジェクトで役に立つようでしたら、スターを付けてサポートしていただけると幸いです。