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

React JSX注册表单验证异常及TypeError报错求助

问题原因

报错的核心是提交按钮同时绑定了onClick和表单的onSubmit:点击按钮时,onClick里调用handleFormSubmit(e)传入的是按钮点击事件的event对象,而非表单提交事件的event。此时e.target是提交按钮本身,不是表单元素,自然找不到e.target.email、e.target.name这些表单控件,所以抛出「Cannot read properties of undefined (reading 'value')」错误。

另外还有两处逻辑漏洞:

  • user对象在组件渲染时就被创建,不会随state更新,导致传给signup的始终是初始的null值
  • 验证逻辑依赖e.target获取值,不如直接用组件内部维护的state更可靠
修复方案

1. 移除提交按钮的onClick事件,统一用表单onSubmit处理逻辑

把signup调用移到handleFormSubmit里,确保触发的是表单提交事件,e.target指向表单元素。

修改前的提交按钮:

<input type="submit" value="SIGN IN" className="signInButton" onClick={(e) => {
  e.preventDefault();
  signup(user);
  handleFormSubmit(e);
}}/>

修改后:

<input type="submit" value="SIGN IN" className="signInButton"/>

2. 重构handleFormSubmit逻辑

直接用组件内的state做验证,同时在函数内部创建最新的user对象:

const handleFormSubmit = (e) => {
  e.preventDefault();

  // 用state直接判断空字段
  setNameEmpty(!name);
  setEmailEmpty(!email);
  setPasswordEmpty(!password);
  setconfirmPasswordEmpty(!cpass);

  // 只有所有字段都不为空时,才调用接口
  if (name && email && password && cpass) {
    const user = { name, email, password, cpass };
    signup(user);
  }
};

3. 修复signup接口的请求格式

手动JSON.stringify会导致请求格式问题,axios会自动序列化JSON,直接传对象即可,同时确保请求头正确:

async function signup(user) {
  console.log("sono dentro la funzione");
  try {
    return await axios.post("http://localhost:3000/signup", user, {
      headers: {
        "Content-Type": "application/json"
      }
    });
  } catch (err) {
    if (err.response) {
      return err.response.data;
    } else {
      console.log("Errore:", err.message);
    }
  }
};

4. 可选优化:统一state初始值

把表单字段的初始值从null改为空字符串"",更符合输入框的默认状态:

const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [cpass, setCpass] = useState("");
修改后的核心组件代码
function RegisterPage() {
  // ... 其他state保持不变
  const [name, setName] = useState("");
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [cpass, setCpass] = useState("");

  const handleFormSubmit = (e) => {
    e.preventDefault();

    setNameEmpty(!name);
    setEmailEmpty(!email);
    setPasswordEmpty(!password);
    setconfirmPasswordEmpty(!cpass);

    if (name && email && password && cpass) {
      const user = { name, email, password, cpass };
      signup(user);
    }
  };

  // ... 其他函数保持不变

  return (
    <div className="backgroundRegister">
      {/* ... 其他元素保持不变 */}
      <form className="formRegister" onSubmit={handleFormSubmit}>
        {/* ... 各个输入框保持不变 */}
        <input type="submit" value="SIGN IN" className="signInButton"/>
      </form>
      {/* ... 其他元素保持不变 */}
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:25:05