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

React(TypeScript)中如何在POST请求中获取表单数据?

用POST方法实现React+TypeScript注册页面跳转与数据展示(Next.js)

一、完善注册页面提交逻辑

我们可以利用Next.js的Server Actions安全处理POST提交,无需手动发送请求,代码如下:

import React from 'react';
import { redirect } from 'next/navigation';

export default function SignUpPage() {
  // 定义Server Action,必须添加'use server'指令标识为服务器端函数
  async function submitCredentials(formData: FormData) {
    'use server';
    
    // 从表单数据中提取姓名
    const firstName = formData.get('firstName') as string;
    const lastName = formData.get('lastName') as string;

    // 基础校验:确保姓名不为空
    if (!firstName.trim() || !lastName.trim()) {
      throw new Error('请完整填写名和姓');
    }

    // 将临时数据存入HttpOnly Cookie(有效期1分钟,仅用于页面跳转传递)
    const { cookies } = await import('next/headers');
    const cookieStore = cookies();
    cookieStore.set('tempUserInfo', JSON.stringify({ firstName, lastName }), {
      maxAge: 60,
      path: '/',
      httpOnly: true, // 仅服务器端可读取,提升安全性
    });

    // 重定向至完成页面
    redirect('/complete');
  }

  return (
    <>
      {/* 通过action属性绑定Server Action,无需手动设置method/post */}
      <form autoComplete="off" action={submitCredentials}>
        <label htmlFor="firstNameInputField">First Name: </label>
        <input 
          type="text" 
          id="firstNameInputField" 
          name="firstName" 
          required // HTML原生必填校验
        />
        <br />
        <label htmlFor="lastNameInputField">Last Name: </label>
        <input 
          type="text" 
          id="lastNameInputField" 
          name="lastName" 
          required 
        />
        <br />
      
        <input type="submit" value="Submit" />
      </form>
    </>
  );
}

关键改动说明:

  • 移除useRef,改用FormData自动收集表单数据,代码更简洁规范
  • 使用Server Actions处理提交逻辑,运行在服务器端,避免客户端暴露敏感流程
  • 通过HttpOnly Cookie临时存储数据,相比URL参数更安全,不会暴露在地址栏
  • 新增HTML原生+服务器端双重必填校验

二、完善完成页面数据获取逻辑

在完成页面中,从服务器端读取临时Cookie数据,展示后立即删除避免残留:

import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';

export default function SignUpComplete() {
  // 服务器端读取Cookie
  const cookieStore = cookies();
  const tempUserInfo = cookieStore.get('tempUserInfo');

  // 若直接访问该页面(无有效数据),重定向回注册页
  if (!tempUserInfo) {
    redirect('/');
  }

  // 解析Cookie中的用户数据
  const { firstName, lastName } = JSON.parse(tempUserInfo.value);

  // 读取后立即删除临时Cookie,避免数据泄露
  cookieStore.delete('tempUserInfo');

  return (
    <>
      <p>Thank you for submitting! Your credentials are:</p>
      <p>First name: {firstName}</p>
      <p>Last name: {lastName}</p>
      <br />
      <a href="/login">Click here to login!</a>
    </>
  );
}

关键改动说明:

  • 利用Next.js的cookies() API在服务器端读取临时数据
  • 添加路由保护:无有效数据时自动重定向回注册页面
  • 读取数据后立即删除Cookie,避免用户刷新或再次访问时仍能看到数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:28:10