You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Hook-Form登录表单:登录/密码错误创建后消失问题求助

React-Hook-Form登录表单错误显示异常问题解决

问题原因

你的表单配置了mode: "onBlur",该模式下仅当字段失去焦点(被触摸)后才会展示校验错误。同时在提交后调用reset时,仅设置了keepErrors: true,但未保留字段的touched(已触摸)状态,导致:

  • login字段若从未被点击过(未触发onBlur),提交时生成的校验错误会因touched状态被重置而无法显示;
  • password字段若之前被触摸过,提交后首次渲染会显示错误,但reset重置touched状态后,二次渲染时错误消失;
  • 其他字段(如captcha)看似正常,多为测试时触摸过字段或渲染时机差异导致,本质问题一致。

解决方案

根据你的业务需求,可选择以下任意一种方案:

1. 重置时保留触摸状态

修改reset的配置参数,同时保留错误与触摸状态:

const onSubmit = async (data) => {
  reset({
    login: "",
    password: "",
    rememberMe: false,
    captcha: "",
  }, {
    keepErrors: true,
    keepTouched: true, // 保留字段的触摸状态
    keepDirty: true // 可选:保留脏字段状态(字段值与默认值不同的标记)
  });
};

2. 切换校验模式为onSubmit

若希望提交表单时直接展示所有字段的错误,无需依赖触摸状态,修改useForm的mode配置:

const {
  register, handleSubmit, clearErrors, setError, reset, formState: { errors },
} = useForm({
  mode: "onSubmit", // 改为提交时触发校验
  defaultValues: {
    login: "", password: "", rememberMe: false, captcha: "",
  }
});

该模式下,表单提交时会一次性校验所有字段,错误直接展示,不受触摸状态影响。

3. 仅在成功提交后重置表单

若你的登录逻辑是异步请求(如调用后端接口),建议仅在请求成功后重置表单,失败时保留表单值与错误:

const onSubmit = async (data) => {
  try {
    // 示例:调用登录接口
    // await loginApi(data);
    // 成功后重置表单,不保留错误
    reset({
      login: "",
      password: "",
      rememberMe: false,
      captcha: "",
    });
  } catch (err) {
    // 失败时设置服务器错误,不重置表单
    setError("server", { message: err.message });
  }
};

内容的提问来源于stack exchange,提问作者Skatoro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:35:08