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

React Js中验证错误对象为空时邮件仍无法发送问题排查

问题根因

你遇到的问题是两个常见的React开发误区共同导致的:

  • React的setErrors是异步状态更新方法,调用后不会立刻更新当前作用域下的errors变量,你在调用setErrors后立刻读取errors拿到的是上一次渲染的旧值,无法拿到本次最新的验证结果。
  • 你写的空对象判断逻辑完全不生效:JS中对象是引用类型,errors === {}永远返回false,且你的验证函数永远返回普通对象,errors === 0、errors === null、errors === []这些判断完全没有匹配的可能,所以哪怕验证通过,也永远走不到发邮件的分支。
    另外你原本的代码在邮件发送请求刚发起时就清空了表单,不需要等请求返回结果,逻辑也不合理,可以优化为发送成功后再清空表单。

修复方案

直接把验证结果存到临时变量中,先判断验证结果是否为空,再执行对应逻辑即可,空对象用Object.keys()判断长度是否为0即可。

修复后的ContactHandler代码如下:

const ContactHandler = (e) => {
    e.preventDefault();
    // 先拿到验证结果存在临时变量中
    const validationErrors = ContactValidation(values);
    setErrors(validationErrors);

    // 直接判断临时变量是否是空对象
    if (Object.keys(validationErrors).length === 0) {
        emailjs.sendForm('api_hidden', 'swiftquiz_template', form.current, 'api_hidden')
            .then((result) => {
                console.log(result.text);
                alert("Sent Successfully ^_^");
                // 发送成功后清空表单和错误提示
                setValues({ name: "", email: "", phone: "", subject: "", description: "" });
                setErrors({});
            }, (error) => {
                console.log(error.text);
            });
    } else {
        console.log("All Fields are required");
    }
}

内容的提问来源于stack exchange,提问作者jerek.orlin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:48:03