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

React表单提交成功后如何重定向到站点根路径?

核心问题说明

你当前代码跳转不生效的最常见原因是react-router-dom版本不匹配:目前主流的v6版本已经移除了useHistory API,替换为useNavigate。你的表单提交场景直接使用路由提供的导航API是最优解,不需要额外维护状态,逻辑最简洁。


适配实现方案

1. react-router-dom v6 版本(当前主流版本)

直接替换原有的useHistory相关逻辑即可,修改后的核心代码如下:
首先替换导入语句:

import { useNavigate } from "react-router-dom";

组件内替换导航实例声明:

// 把原来的 const history = useHistory() 替换为下面的代码
const navigate = useNavigate();

修改handleSubmit逻辑,增加响应校验避免提交失败也执行跳转,同时补充表单清空逻辑:

function handleSubmit(e) {
  e.preventDefault();
  fetch("/", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: encode({ "form-name": "contact", name, email, message }),
  })
  .then((response) => {
    // 校验服务器响应是否正常
    if (!response.ok) throw new Error("提交失败")
    console.log('Email sent');
    // 执行跳转
    navigate('/');
    // 兜底清空表单内容,避免跳转失败内容残留
    setName('');
    setEmail('');
    setMessage('');
  })
  .catch((error) => {
    console.log(error);
    alert("消息发送失败,请稍后重试");
  });
}

2. react-router-dom v5 版本

如果确认你的项目用的是v5版本,原来的history.push('/')逻辑本身没有问题,只需要给handleSubmit加上上面的响应校验逻辑即可,绝大多数情况是fetch收到了服务器错误响应但没有拦截,导致你以为跳转逻辑失效。


三种跳转方案适配性说明

  • 导航API(useHistory/useNavigate):最适配你的场景,事件触发后直接调用即可,代码量最少,逻辑最直观
  • Redirect组件/状态变量控制跳转:更适合路由守卫、权限校验这类需要根据状态条件渲染跳转的场景,你这个表单提交的场景用这类方案需要额外维护一个redirect状态,多了不必要的逻辑,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:54:03