数据预取时怎么避免重复请求?

UX-庆芳 阅读 3

我在用 React 做一个商品详情页,进入页面前想提前拉取商品数据。但发现如果用户快速切换商品,会发起多个重复的请求,体验很不好。

我试过用 useRef 存请求状态,但还是没控制住。比如下面这段代码:

useEffect(() => {
  const fetchData = async () => {
    if (isFetching.current) return;
    isFetching.current = true;
    const res = await fetch(<code>/api/product/${id}</code>);
    setData(await res.json());
    isFetching.current = false;
  };
  fetchData();
}, [id]);

可一旦 id 变化快,还是会同时跑好几个请求,有啥靠谱的防重方案吗?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
❤怡博
❤怡博 Lv1
遇到这个问题,推荐的做法是在每次请求开始前取消之前的请求。可以使用 AbortController 来实现这个功能。这样即使 id 快速变化,也能确保只处理最新的请求,避免重复请求带来的问题。

下面是修改后的代码示例:
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;

const fetchData = async () => {
try {
const res = await fetch(/api/product/${id}, { signal });
const data = await res.json();
setData(data);
} catch (err) {
if (err.name === 'AbortError') {
console.log('Request aborted');
} else {
console.error('Fetch error:', err);
}
}
};

fetchData();

return () => {
controller.abort(); // 组件卸载或 id 变化时取消请求
};
}, [id]);


通过这种方式,当 id 变化时,上一个请求会被取消,从而避免了重复请求的问题。
点赞
2026-03-22 19:00