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

React中页面导航后如何将表单提交数据传递至新页面?

React中页面导航后如何将表单提交数据传递至新页面?

嘿,刚好我之前用react-router-dom v6做类似的表单跳转需求时,踩过几个坑,给你分享两个不用Redux或全局状态的实用办法,完全符合你的要求:

方法1:用useNavigate的state参数传递(推荐无敏感数据且不需要持久化的场景)

这个是v6里最直接的方案,导航时把表单数据存在路由的state里,新页面通过useLocation就能拿到,完全不用全局状态,也不会有嵌套问题。

提交页面的代码实现

假设你已经用useState管理了表单的各个字段,在handleSubmit里这么写:

import { useNavigate } from 'react-router-dom';
import { useState } from 'react';

const FormComponent = () => {
  // 假设你用useState存表单字段
  const [http, setHttp] = useState('');
  const [bindIP, setBindIP] = useState('');
  const [host, setHost] = useState('');
  const [port, setPort] = useState('');
  const navigate = useNavigate();

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    // 组装表单数据
    const formData = { http, bindIP, host, port };
    // 导航时把数据存在state中
    navigate('/listener-details', { state: { formData } });
  };

  // 表单JSX部分省略...
  return <form onSubmit={handleSubmit}>...</form>;
};

目标页面(/listener-details)取数据

在新页面用useLocation获取路由state里的表单数据,记得加TypeScript的类型断言避免报错:

import { useLocation } from 'react-router-dom';

const ListenerDetails = () => {
  const location = useLocation();
  // 用TS类型断言指定数据结构,避免类型报错
  const formData = location.state?.formData as {
    http: string;
    bindIP: string;
    host: string;
    port: string;
  };

  return (
    <div className="listener-details">
      <h2>Listener 配置详情</h2>
      <ul>
        <li>HTTP 设置: {formData.http}</li>
        <li>绑定IP: {formData.bindIP}</li>
        <li>主机地址: {formData.host}</li>
        <li>端口: {formData.port}</li>
      </ul>
    </div>
  );
};

export default ListenerDetails;

注意点

  • 这个方法的state数据不会出现在URL里,适合不想暴露的非敏感数据(但要注意,浏览器开发者工具的历史记录里还是能看到,所以绝对敏感的数据别用这个)
  • 硬刷新页面的话,state里的数据会丢失,因为这部分是存在客户端路由的历史栈里,不是持久化存储

方法2:用URL搜索参数传递(适合需要持久化或分享的场景)

如果你的表单数据不需要保密,而且希望刷新页面后数据不丢失,或者可以分享带参数的链接,那用URL搜索参数是更好的选择。

提交页面的代码实现

用createSearchParams把表单数据转成URL参数,然后导航:

import { useNavigate, createSearchParams } from 'react-router-dom';
import { useState } from 'react';

const FormComponent = () => {
  const [http, setHttp] = useState('');
  const [bindIP, setBindIP] = useState('');
  const [host, setHost] = useState('');
  const [port, setPort] = useState('');
  const navigate = useNavigate();

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    // 把表单数据转成搜索参数
    const searchParams = createSearchParams({
      http,
      bindIP,
      host,
      port
    });
    // 导航到目标页面,带上搜索参数
    navigate({
      pathname: '/listener-details',
      search: `?${searchParams}`
    });
  };

  return <form onSubmit={handleSubmit}>...</form>;
};

目标页面(/listener-details)取数据

用useSearchParams钩子直接获取URL里的参数:

import { useSearchParams } from 'react-router-dom';

const ListenerDetails = () => {
  // useSearchParams返回一个数组,第一个元素就是搜索参数对象
  const [searchParams] = useSearchParams();
  
  // 逐个取出参数,或者转成对象
  const formData = {
    http: searchParams.get('http') || '',
    bindIP: searchParams.get('bindIP') || '',
    host: searchParams.get('host') || '',
    port: searchParams.get('port') || ''
  };

  return (
    <div className="listener-details">
      <h2>Listener 配置详情</h2>
      <ul>
        <li>HTTP 设置: {formData.http}</li>
        <li>绑定IP: {formData.bindIP}</li>
        <li>主机地址: {formData.host}</li>
        <li>端口: {formData.port}</li>
      </ul>
    </div>
  );
};

export default ListenerDetails;

注意点

  • 数据会明文出现在URL里,所以别放密码、密钥这类敏感信息
  • 硬刷新页面数据不会丢失,还能直接分享这个链接给别人,对方打开就能看到相同的详情

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:44:52