You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Query预取功能未按预期工作,寻求技术帮助

React Query预取功能未按预期复用缓存问题求助

刚着手将应用迁移至React Query,作为该库的新手,我怀疑自己可能误解了预取功能的工作逻辑,目前预取未按预期生效,恳请协助。

我希望在用户登录后预取一个耗时的API接口,以便用户进入需要该数据的页面时,能获得更好的感知性能。

已执行的操作

  • 首页中执行预取:
queryClient.prefetchQuery(["requisition", auth.token, auth.id], () =>
  getRequisitionsAllData(auth.token, auth.id),
);
  • 自定义Hook:
export const useRequisitionQuery = (token, id) => {
  const queryOptions = { staleTime: 300 };
  return useQuery(
    ["requisition", token, id],
    () => getRequisitionsAllData(token, id),
    queryOptions,
  );
};
  • 在需要数据的组件中使用Hook:
const { isLoading, isError, data, error, isFetching } = useRequisitionQuery(
  token,
  id,
);

观测结果

  • 首页的预取是生效的:网络请求显示预取的API接口已成功发起并返回数据
  • 跳转至目标页面后,缓存数据未被复用,而是重新发起了请求,页面无法立即获取数据:网络请求显示重复发起了相同的API请求
  • 依赖该数据的表格需等待请求完成才会渲染,且console.log(data)在请求完成前返回[]

我是否误解了预取的工作机制?我认为缓存数据应立即加载。感谢您的时间。

补充页面跳转细节

使用React Router结合RequireAuth组件包裹路由,App.js代码如下:

<Router>
  <MasterNavbar />
  <Routes>
    <Route path="/SignIn" element={<SignIn setToken={setToken} />} />
    <Route
      path="/"
      element={
        <RequireAuth>
          <HomeLanding />
        </RequireAuth>
      }
    />

    <Route
      path="/TrackRequisitions"
      element={
        <RequireAuth>
          <TrackRequisitions />
        </RequireAuth>
      }
    />
  </Routes>
</Router>;

RequireAuth仅用于校验用户是否持有有效token:

if (!auth.token || !auth.id || !auth.access) {
  return <Navigate to="/SignIn" state={{ from: location }} />;
}
return children;

页面跳转通过导航栏的NavButton组件触发:

<NavButton navTo="Track Requisitions" link="/TrackRequisitions" />;

NavButton组件代码:

export default function NavButton(props) {
  return (
    <Button
      sx={{
        justifyContent: "left",
        "&:hover": {
          cursor: "pointer",
          backgroundColor: "#FFFFFF",
          "& .button-text": {
            textDecoration: "underline",
          },
        },
      }}
      color="inherit"
      href={props.link}
    >
      <Typography className="button-text" color="black" fontWeight={500}>
        {props.navTo}
      </Typography>
    </Button>
  );
}

内容的提问来源于stack exchange,提问作者George Nassar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:27