数据预取时怎么避免重复请求?
我在用 React 做一个商品详情页,进入列表页的时候想提前把详情数据拉下来,用了 useEffect 里调接口做预取。但用户如果快速点进同一个商品两次,发现控制台发了两次一样的请求,这不就浪费了吗?
我试过加个 loading 状态判断,但预取是在另一个组件里做的,状态不好共享。也想过用全局缓存,但不确定怎么设计才靠谱。有没有比较通用的做法?比如用 axios 的拦截器或者封装一个带缓存的 fetch?
这是我现在预取的代码:
useEffect(() => {
const prefetchProduct = async (id) => {
const res = await fetch(<code>/api/product/${id}</code>);
const data = await res.json();
// 存到 context 或 zustand 里
setPrefetchedData(id, data);
};
products.forEach(p => prefetchProduct(p.id));
}, [products]);
怎么才能确保同一个 id 只请求一次啊?
这样同一个 id 无论触发多少次 fetch,底层只发一次请求,后续的直接等那个 promise。
如果你还想缓存已请求过的数据(不只是 pending 状态),可以改成这样:
如果你项目里用了 axios,思路是一样的,拦截器里判断一下就行。不过上面这个原生 fetch 的方案够用了,逻辑清晰也容易维护。