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

如何在React-Hook-Form+TypeScript中实现表单续页跳转

解决方案:表单进度路由追踪与自动恢复

核心思路是追踪用户最后停留的表单页面路由,将其持久化存储,在用户重新进入表单流程时自动跳转到该路由。以下是基于你的技术栈的具体实现方案:

1. 路由追踪与持久化存储

在每个表单子页面组件中,当组件挂载或路由变化时,将当前路由保存到localStorage(或后端数据库,根据可靠性需求选择)。

示例(以FirmOverview组件为例,其他页面同理):

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

const FirmOverview = () => {
  const location = useLocation();

  useEffect(() => {
    // 保存当前路由到localStorage,统一键名便于后续读取
    localStorage.setItem('lastProfileSetupRoute', location.pathname);
  }, [location.pathname]);

  // 你的react-hook-form表单逻辑...
};

如果需要更可靠的存储(避免用户清除本地存储),可以将路由信息保存到后端用户表中:

// 子页面中保存路由到后端
useEffect(() => {
  const saveLastRoute = async () => {
    await fetch('/api/user/profile-setup-last-route', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ route: location.pathname })
    });
  };
  
  saveLastRoute();
}, [location.pathname]);

2. 父路由组件实现自动重定向

在GeneralPartnerProfileSetup父组件中,当用户进入表单流程时,读取存储的路由并自动跳转到对应页面。

import { useEffect } from 'react';
import { useNavigate, Outlet } from 'react-router-dom';
import { PrivateRoutes } from './path-to-your-routes';

const GeneralPartnerProfileSetup = () => {
  const navigate = useNavigate();

  useEffect(() => {
    // 定义所有有效表单路由,用于校验存储的路由合法性
    const validFormRoutes = [
      PrivateRoutes.FIRM_OVERVIEW,
      PrivateRoutes.FUND_OVERVIEW,
      PrivateRoutes.PAST_PERFORMANCE,
      PrivateRoutes.INVESTMENT_TEAM,
      PrivateRoutes.FUND_DETAILS,
      PrivateRoutes.FUND_STRUCTURE,
      PrivateRoutes.REVIEW_AND_SUBMIT
    ];

    // 从localStorage读取路由(如果用后端则替换为接口请求)
    const lastRoute = localStorage.getItem('lastProfileSetupRoute');

    // 校验路由有效性并跳转
    if (lastRoute && validFormRoutes.includes(lastRoute)) {
      navigate(lastRoute);
    } else {
      // 默认跳转到第一页,确保流程正常启动
      navigate(PrivateRoutes.FIRM_OVERVIEW);
    }
  }, [navigate]);

  return <Outlet />;
};

如果用后端存储,替换为接口请求逻辑:

useEffect(() => {
  const fetchLastRoute = async () => {
    const res = await fetch('/api/user/profile-setup-last-route');
    const data = await res.json();
    const lastRoute = data.lastRoute;

    const validFormRoutes = [/* 同上 */];
    if (lastRoute && validFormRoutes.includes(lastRoute)) {
      navigate(lastRoute);
    } else {
      navigate(PrivateRoutes.FIRM_OVERVIEW);
    }
  };

  fetchLastRoute();
}, [navigate]);

3. 提交完成后清除追踪记录

当用户在ReviewAndSubmit页面完成表单提交后,需要清除存储的路由记录,避免下次进入表单流程时错误跳转到提交页。

import { useNavigate } from 'react-router-dom';
import { useForm } from 'react-hook-form';
import { PrivateRoutes } from './path-to-your-routes';

const ReviewAndSubmit = () => {
  const navigate = useNavigate();
  const { handleSubmit } = useForm();

  const onSubmit = async (data: FormData) => {
    // 执行表单提交逻辑
    const submitSuccess = await submitProfileData(data);

    if (submitSuccess) {
      // 清除localStorage中的路由记录(后端存储则调用接口删除)
      localStorage.removeItem('lastProfileSetupRoute');
      // 跳转到个人资料页面或其他页面
      navigate(PrivateRoutes.PROFILE_UPDATE);
    }
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 表单内容 */}
    </form>
  );
};

额外注意事项

  • 确保所有表单路由都包含在validFormRoutes数组中,避免非法路由跳转。
  • 如果用户手动修改URL跳转到未完成的后续页面,建议在子页面中校验前置表单是否已填写,防止跳过流程(可结合react-hook-form的表单数据状态判断)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:29