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

提交按钮无法触发onSubmit函数,请求排查原因

提交按钮无法触发onSubmit的原因分析

核心原因:Zod校验拦截了提交动作

你的signupSchema中定义了必填字段verifyCode和verifyCodeExpiry,但在表单组件里既没有添加对应的输入项,也没有在useForm的defaultValues中设置这两个字段的默认值。react-hook-form结合zod resolver时,只要有必填字段未通过校验,就会直接拦截提交流程,不会执行onSubmit函数。

另外,性别选择组件(Select)存在绑定不完整的问题:只绑定了onChange,没有传入field.value,可能导致gender字段值无法正确同步,也可能触发额外的校验失败。

修复方案

方案1:调整Zod Schema(如果这两个字段不是注册时必填)

如果verifyCode和verifyCodeExpiry是后续流程使用的字段,不是注册时必须填写的,将它们设为可选字段:

// 修改后的signupSchema.ts
import { z } from "zod";

const signupSchema = z.object({
  firstName: z.string().min(1, { message: "First name is required" }),
  lastName: z.string().min(1, { message: "Last name is required" }),
  email: z
    .string()
    .min(1, { message: "Email is required" })
    .email({ message: "Please use a valid email address" }),
  password: z.string().min(1, { message: "Password is required" }),
  gender: z.enum(["male", "female", "other"]),
  verifyCode: z.string().min(1, { message: "Verify code is required" }).optional(),
  verifyCodeExpiry: z.date({
    required_error: "Verify code expiry is required",
  }).optional(),
  isVerified: z.boolean().default(false),
  githubId: z.string().optional().default(""),
  googleId: z.string().optional().default(""),
});

export default signupSchema;

方案2:补充表单输入项(如果这两个字段是注册必填)

在表单中添加verifyCode的输入框和verifyCodeExpiry的日期选择器,并更新defaultValues:

// 在page.tsx的defaultValues中补充字段
const form = useForm<z.infer<typeof signupSchema>>({
  resolver: zodResolver(signupSchema),
  defaultValues: {
    firstName: "",
    lastName: "",
    email: "",
    password: "",
    gender: "male",
    verifyCode: "",
    verifyCodeExpiry: new Date(), // 设置默认日期
  },
});

// 在表单中添加对应的FormField
<FormField
  control={form.control}
  name="verifyCode"
  render={({ field }) => (
    <FormItem>
      <FormLabel>Verify Code</FormLabel>
      <FormControl>
        <Input placeholder="Verify Code" {...field} />
      </FormControl>
      <FormMessage />
    </FormItem>
  )}
/>
<FormField
  control={form.control}
  name="verifyCodeExpiry"
  render={({ field }) => (
    <FormItem>
      <FormLabel>Verify Code Expiry</FormLabel>
      <FormControl>
        <Input type="date" {...field} />
      </FormControl>
      <FormMessage />
    </FormItem>
  )}
/>

修复Select组件绑定

确保性别选择组件正确绑定field的值:

<Select value={field.value} onValueChange={field.onChange}>
  <FormControl>
    <SelectTrigger>
      <SelectValue placeholder="Select gender" />
    </SelectTrigger>
  </FormControl>
  <SelectContent>
    <SelectItem value="male">Male</SelectItem>
    <SelectItem value="female">Female</SelectItem>
    <SelectItem value="other">Other</SelectItem>
  </SelectContent>
</Select>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:12:11