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

React Hook Form结合Form Action问题:提交无校验直接触发登录

问题排查与解决方案

一、提交不触发校验的原因

你当前代码直接使用原生<form>的action属性处理提交,完全绕过了React Hook Form(RHF)的校验流程。RHF的校验逻辑是通过form.handleSubmit方法触发的——只有当提交函数被handleSubmit包裹时,才会自动调用你配置的Zod resolver完成校验,校验通过后才会执行后续登录逻辑。

现在的代码里,<form>的action直接调用startTransition(() => handleLogin(formData)),没有经过RHF的校验环节,所以提交时会跳过所有校验,直接调用登录接口。

二、修复方案

将<form>的action替换为RHF的onSubmit,并用form.handleSubmit包裹登录处理函数,这样就能触发校验流程:

// 替换原<form>部分
<form
  onSubmit={form.handleSubmit(async (validatedData) => {
    startTransition(async () => {
      // 直接使用RHF校验后的合法数据,无需从FormData手动提取
      const { email, password } = validatedData;
      let user = await signIn(email, password);
      
      // 后续登录逻辑保持不变
      if (isUser(user)) {
        const { email, isSignedIn, error } = user;
        if (error.isError) {
          toast({
            title: `${error?.message}`,
            variant: "destructive",
            action: <XCircle size={25} />,
          });
        } else {
          setSession(user);
          toast({
            title: `${email} logged in successfully!`,
            variant: "success",
            action: <CheckCircle size={25} />,
          });
          redirect("/dashboard");
        }
      }
    });
  })}
  className="w-2/3 space-y-6"
>

修改后,提交表单会先执行Zod校验,失败时自动在FormMessage中显示错误提示,不会调用登录接口;只有校验通过,才会执行登录逻辑。

三、React Hook Form与Form Action能否结合使用?

可以结合,需根据场景调整实现方式:

客户端Form Action(React 18+)

在客户端使用Form Action时,可先手动触发RHF校验,通过后再执行Form Action逻辑:

<form
  action={async (formData) => {
    // 手动触发全量校验
    const isValid = await form.trigger();
    if (!isValid) return; // 校验失败则终止流程

    // 校验通过后执行登录逻辑
    startTransition(() => handleLogin(formData));
  }}
  className="w-2/3 space-y-6"
>

服务器端Form Action(如Next.js)

如果是服务器端Form Action,可先在客户端完成RHF前端校验,通过后再提交表单到服务器;同时建议在服务器端再次用Zod校验,实现前后端双重校验,提升安全性。


内容的提问来源于stack exchange,提问作者Mustafa Walid Marzouk Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:36:26