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

如何捕获React Hook Form验证错误并阻止错误时发送邮件

解决React Hook Form验证错误时阻止EmailJS发送邮件的问题

你当前的写法存在核心问题:直接调用handleSubmit(onSubmit)()后,未等待验证结果就执行了EmailJS发送逻辑,且handleSubmit在验证失败时不会抛出可被try/catch捕获的错误——它只会更新formState.errors状态,所以你的try/catch完全起不到拦截作用。

以下是两种可靠的解决方案:

方案一:将邮件发送逻辑移入onSubmit(推荐)

handleSubmit的核心作用就是仅在表单验证通过时,才执行传入的回调函数。把邮件发送逻辑直接放到onSubmit里,就能天然保证只有验证通过才触发邮件发送。

修改后的完整代码:

import React, { useRef, useState } from "react";
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import { string, object, InferType } from "yup";
import emailjs from "@emailjs/browser";

type Props = InferType<typeof schema>;

const schema = object({
  firstName: string().required("First name is required"),
  lastName: string().required("Last name is required"),
});

function FormEmail() {
  const form = useRef(null);
  const [value, setValue] = useState<string | undefined>();

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<Props>({
    resolver: yupResolver(schema),
  });

  // 验证通过后才会执行此函数
  const onSubmit = () => {
    emailjs
      .sendForm(
        "service_ztay5wh",
        "template_wcc4f29",
        form.current!,
        "aXbWTWKdwzgImlYqz"
      )
      .then(
        (result) => {
          console.log(result.text);
        },
        (error) => {
          console.log(error.text);
        }
      );
  };

  return (
    <div>
      {/* 直接绑定handleSubmit处理表单提交 */}
      <form onSubmit={handleSubmit(onSubmit)} ref={form}>
        <h3>First Name</h3>
        <input
          id="firstName"
          type="text"
          {...register("firstName")}
        />
        <span className="error">{errors?.firstName?.message}</span>

        <h3>Last Name</h3>
        <input
          id="lastName"
          type="text"
          {...register("lastName")}
        />
        <span className="error">{errors?.lastName?.message}</span>

        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

export default FormEmail;

方案二:手动检查验证状态(适合需保留自定义提交函数的场景)

如果必须保留自定义的sendEmail函数,可以通过检查formState.errors是否为空,来决定是否执行邮件发送:

const sendEmail = (e: { preventDefault: () => void }) => {
  e.preventDefault();
  // 触发验证逻辑
  handleSubmit(() => {})();
  
  // 检查是否存在验证错误
  if (Object.keys(errors).length > 0) {
    return; // 有错误则终止执行
  }

  emailjs
    .sendForm(
      "service_ztay5wh",
      "template_wcc4f29",
      form.current!,
      "aXbWTWKdwzgImlYqz"
    )
    .then(
      (result) => {
        console.log(result.text);
      },
      (error) => {
        console.log(error.text);
      }
    );
};

注意

方案一完全遵循React Hook Form的设计规范,无需手动处理验证状态判断,代码更简洁可靠,是官方推荐的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:15:34