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

Next.js多步骤表单如何根据router.asPath变化实时更新steps状态

问题根源

  1. 直接把状态更新逻辑写在组件根作用域时,每次组件渲染都会触发判断,条件满足就调用setStepsData,而状态更新又会触发组件重渲染,形成无限循环,因此触发重渲染超限错误。
  2. 用空依赖数组的useEffect时,逻辑只会在组件首次挂载完成后执行一次,后续路由变化不会触发回调,因此只有手动刷新时状态才会更新。

解决方法

将路由相关参数加入useEffect的依赖数组,同时增加路由就绪判断、避免不必要的状态更新即可:

import { useEffect } from 'react';
import { useRouter } from 'next/router';

// 你的Context组件内部逻辑
const router = useRouter();

useEffect(() => {
  // 等待Next.js路由初始化完成,避免初始加载时query参数为空导致判断错误
  if (!router.isReady) return;

  // 从路由查询参数中提取step值,默认第一步为0
  const currentStep = Number(router.query.step) || 0;

  // 按当前步骤生成对应的stepper状态,后续新增步骤只需调整数组即可
  const expectedSteps = [
    { name: 'Vertrag', status: currentStep >= 0 ? 'current' : 'upcoming' },
    { name: 'Dateneingabe', status: currentStep >= 1 ? 'current' : 'upcoming' },
    { name: 'Bestätigung', status: currentStep >= 2 ? 'current' : 'upcoming' },
  ];

  // 仅在状态不一致时更新,避免不必要的重渲染
  setStepsData(prevSteps => {
    if (JSON.stringify(prevSteps) === JSON.stringify(expectedSteps)) {
      return prevSteps;
    }
    return expectedSteps;
  });
// 依赖项加入路由就绪状态和step参数,路由变化时自动触发逻辑
}, [router.isReady, router.query.step]);

额外说明

如果使用Next.js 13+ App Router,需要替换useRouter为useSearchParams获取查询参数,逻辑和上述一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:00:03