React中异步请求loading状态总延迟显示怎么办?
在React项目里,我给API请求加了loading状态,但每次点击按钮后loading动画都要等1-2秒才显示,用户体验特别差。代码逻辑应该是对的,但实际效果就是不及时:
function ProductList() {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(false);
const fetchProducts = () => {
setLoading(true); // 应该立刻显示loading
axios.get('/api/products')
.then(res => setProducts(res.data))
.finally(() => setLoading(false));
};
return (
<button onClick={fetchProducts}>
{loading ? 'Loading...' : 'Fetch Data'}
</button>
);
}
我试过把setState放在onClick直接调用,也确认过网络请求确实有2秒延迟。但为什么状态更新不及时?难道是useEffect的问题吗?
或者退一步,用setTimeout包一下setLoading也行,应该能用。
setLoading(true)后,React 可能会批量处理更新,导致视觉上看起来有延迟。可以优化成这样:
原理是利用 Promise.resolve().then() 把网络请求“推迟”到下一个事件循环执行,让 React 有机会先更新 loading 状态。
另外,如果你用的是 React 18 + 并开启了 concurrent 模式,那 setState 的行为会更不可预测,这种处理方式更优雅。
如果你用的是旧版 React(比如 17 或更早),也可以考虑用 useReducer 来提升状态更新的优先级。