数据预取时怎么避免重复请求?
我在用 React 做一个商品详情页,进入页面前想提前拉取商品数据。但发现如果用户快速切换路由,useEffect 里调用的 fetchProduct(id) 会被多次触发,导致同一个商品请求好几次。
我试过加个 loading 状态判断,但组件卸载后状态就失效了,还是挡不住重复请求。有没有靠谱的预取方案能自动去重或者取消旧请求?
useEffect(() => {
const controller = new AbortController();
fetch(<code>/api/product/${id}</code>, { signal: controller.signal })
.then(res => res.json())
.then(setProduct);
return () => controller.abort();
}, [id]);
这样每次切换路由时,上一个请求会被立刻取消,不会堆积。
如果你想更省心,直接上 React Query 得了,这玩意儿自带请求去重、缓存、自动取消,一行代码搞定:
同一个 queryKey 的请求会自动去重,切换路由时旧请求会被取消,根本不用自己写 AbortController。
项目里如果还没引入这个库,值得花十分钟加上,能少写很多边界代码。