步骤进度条加载状态怎么同步到每个步骤?
我在做一个多步骤表单,想在每个步骤切换时显示加载状态,但进度条的 activeIndex 和 loading 状态总是对不上。比如点“下一步”后 loading 是 true,但进度条却还没更新到下一个步骤,体验很奇怪。
我试过把 setActiveIndex 放在 setLoading(true) 前面,也试过用 useEffect 监听 loading 变化再更新索引,但要么闪一下错位,要么根本没反应。下面是我的简化代码:
const [activeIndex, setActiveIndex] = useState(0);
const [loading, setLoading] = useState(false);
const handleNext = async () => {
setLoading(true);
await submitStep(activeIndex); // 模拟 API 调用
setActiveIndex(prev => prev + 1);
setLoading(false);
};
你的场景是:loading为true时,用户期望看到进度条已经“前进”到下一步的视觉反馈,但activeIndex还是当前值,所以会觉得对不上。
解决思路是增加一个“待激活索引”的概念,用来在loading期间显示过渡状态:
进度条组件这样接收:
简单说就是两步:loading时用pendingIndex让进度条先“跳”过去,API返回后再正式commit activeIndex并关闭loading。这样用户看到的流程就是点下一步 → 进度条前进一步并显示加载 → 加载完成状态消失,视觉上连贯多了。
建议改成这样,把状态更新放在一起,并且在 API 调用前就更新 activeIndex:
关键点:
1. 先计算 nextIndex,这样进度条会立即更新
2. 把两个 setState 放在一起,减少渲染次数
3. 用 try/finally 确保 loading 状态一定会被重置
这样处理之后进度条会先跳到下一步,然后显示 loading,体验就顺了。我经常遇到这种 UI 状态同步的问题,每次都要跟 React 的更新机制斗智斗勇...