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

react-hook-form结合Zod自定义错误消息失效,均显示Required

React Hook Form + Zod 自定义错误消息不显示问题排查与修复

一、检查Zod Schema的错误消息配置

确保你在Zod的校验规则中正确传入自定义提示,避免使用默认的"Required":
错误写法(默认提示):

const schema = z.object({
  email: z.string().required()
});

正确写法(自定义提示):

const schema = z.object({
  email: z.string().required("请输入您的邮箱地址"),
  password: z.string().min(6, "密码长度不能少于6位").required("密码不能为空")
});

二、确认React Hook Form的Resolver配置

必须通过@hookform/resolvers/zod将Zod规则与react-hook-form绑定,否则会使用react-hook-form默认校验,导致自定义消息失效:

import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { registerSchema } from "./schema";

function RegisterForm() {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: zodResolver(registerSchema),
    mode: "onSubmit" // 可根据需求设置onBlur/onChange等模式
  });

  // 提交逻辑
  const onSubmit = (data) => {
    console.log(data);
  };

  // ... 表单渲染
}

三、检查通用Input组件的错误读取逻辑

确保通用Input组件正确读取errors对象中的message属性,而非硬编码"Required":
错误写法(硬编码提示):

function Input({ label, name, register }) {
  return (
    <div className="form-group">
      <label>{label}</label>
      <input {...register(name)} />
      {errors[name] && <span className="error">Required</span>}
    </div>
  );
}

正确写法(读取Zod自定义消息):

function Input({ label, name, register, errors }) {
  return (
    <div className="form-group">
      <label>{label}</label>
      <input {...register(name)} />
      {errors[name] && <span className="error">{errors[name].message}</span>}
    </div>
  );
}

同时在父组件中正确传递errors参数:

// 表单组件中调用Input
<Input 
  label="邮箱" 
  name="email" 
  register={register} 
  errors={errors} 
/>

四、避免在register中重复设置校验规则

如果在register方法中额外设置required: true,会覆盖Zod的校验配置,导致自定义消息失效:
错误写法:

<input {...register("email", { required: true })} />

正确写法:

<input {...register("email")} />

完全依赖Zod Schema定义的校验规则即可,react-hook-form会通过resolver同步这些规则。

五、确认提交逻辑正确

确保使用handleSubmit处理表单提交,避免手动拦截错误消息:

<form onSubmit={handleSubmit(onSubmit)}>
  <Input label="邮箱" name="email" register={register} errors={errors} />
  <Input label="密码" name="password" register={register} errors={errors} />
  <button type="submit">完成注册</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:47:41