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

React.js(Next.js)表单提交问题:无法提交表单如何处理?

在Next.js中提交表单数据的解决方案

你的代码里checklogin函数已经能触发(alert能弹),说明表单提交绑定是有效的,目前缺的是获取输入框的值和实际的提交请求逻辑,给你两种可行方案:

方案1:用受控组件(React推荐)

通过useState绑定输入框,实时跟踪输入内容,提交时直接用状态里的值,适合需要实时验证、动态修改的场景。

修改后的完整代码:

import { useState } from 'react';

export default function Home() {
  // 初始化表单状态
  const [formData, setFormData] = useState({
    username: '',
    password: ''
  });

  // 实时更新输入值到状态
  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { id, value } = e.target;
    setFormData(prev => ({
      ...prev,
      [id]: value
    }));
  };

  const checklogin = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    // 这里能拿到完整的表单数据
    console.log('提交的数据:', formData);
    
    // 发送POST请求到后端接口
    try {
      const res = await fetch('/api/login', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(formData),
      });
      
      if (res.ok) {
        const data = await res.json();
        alert('登录成功');
        // 这里加登录后的逻辑,比如跳转、存token
      } else {
        alert('账号或密码错误');
      }
    } catch (err) {
      console.error('请求失败:', err);
      alert('网络出错,请稍后再试');
    }
  };

  return (
    <form className="forms-sample" onSubmit={checklogin}>
      <div className="form-group first">
        <label htmlFor="username">Username</label>
        <input
          type="text"
          className="form-control"
          placeholder="your-email@gmail.com"
          id="username"
          value={formData.username}
          onChange={handleInputChange}
        />
      </div>
      <div className="form-group last mb-3">
        <label htmlFor="password">Password</label>
        <input
          type="password"
          className="form-control"
          placeholder="Your Password"
          id="password"
          value={formData.password}
          onChange={handleInputChange}
        />
      </div>
      <input
        type="submit"
        name="submit"
        defaultValue="Log In"
        className="btn btn-block btn-primary"
      />
    </form>
  );
}

方案2:直接用FormData获取数据

如果是简单表单,不想写受控组件的逻辑,可以直接通过表单元素创建FormData对象,一次性获取所有输入值:

只需要修改checklogin函数:

const checklogin = async (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault();
  // 从表单元素创建FormData
  const form = e.currentTarget;
  const formData = new FormData(form);
  
  // 转成对象方便查看
  const formObj = Object.fromEntries(formData.entries());
  console.log('提交的数据:', formObj);
  
  // 发送请求,FormData不需要手动设置Content-Type
  try {
    const res = await fetch('/api/login', {
      method: 'POST',
      body: formData,
    });
    
    if (res.ok) {
      alert('登录成功');
    } else {
      alert('登录失败');
    }
  } catch (err) {
    console.error('请求失败:', err);
    alert('网络出错');
  }
};

可选:Next.js后端API示例

如果需要写后端处理登录请求,在pages/api/login.ts(Pages Router)或者app/api/login/route.ts(App Router)里添加:

// Pages Router 示例
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== 'POST') {
    return res.status(405).json({ message: '仅支持POST请求' });
  }
  
  const { username, password } = req.body;
  // 这里替换成你的实际验证逻辑,比如查数据库
  if (username === 'test' && password === '123456') {
    res.status(200).json({ success: true, message: '登录成功' });
  } else {
    res.status(401).json({ success: false, message: '账号或密码错误' });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:29