跳至内容

formState

表单状态

formState: 对象

此对象包含有关整个表单状态的信息。它可以帮助您跟踪用户与表单应用程序的交互。

返回值

名称类型描述
isDirty布尔值

用户修改任何输入后设置为true

  • 重要:确保在 useForm 中提供所有输入的 defaultValues,这样 hook form 可以有一个单一的事实来源来比较表单是否被修改。

    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,这样 hook form 可以有一个单一的事实来源来比较每个字段的修改状态。

  • 修改的字段不会表示为 isDirty formState,因为修改的字段是在字段级别标记为修改,而不是整个表单。如果您想确定整个表单状态,请使用isDirty代替。

touchedFields对象一个包含用户交互过的所有输入的对象。
defaultValues对象

useForm的 defaultValues 中设置的值或通过 reset API 更新的 defaultValues。

isSubmitted布尔值表单提交后设置为true。将保持 true 直到调用reset方法。
isSubmitSuccessful布尔值

表示表单已成功提交,没有运行时错误。

isSubmitting布尔值true 如果表单当前正在提交。 false 否则。
isLoading布尔值

true 如果表单当前正在加载异步 defaultValues。

重要:此属性仅适用于异步defaultValues

const {
formState: { isLoading }
} = useForm({
defaultValues: async () => await fetch('/api')
});
submitCount数字表单提交的次数。
isValid布尔值
如果表单没有任何错误,则设置为true

setErrorisValid formState 没有影响, isValid 将始终通过整个表单验证结果得出。

isValidating布尔值在验证期间设置为true
validatingFields布尔值捕获正在进行异步验证的字段。
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 对您的项目很有用,请考虑给它加星标并支持它。