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

ReactQuery窗口聚焦重复获取会话触发重复登录问题求助

解决方案

1. 确保QueryClient配置正确生效

先检查你的QueryClient实例是否正确配置了禁用聚焦重连的参数,并且已经通过QueryClientProvider全局注入:

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      refetchOnMount: false,
      refetchOnWindowFocus: false,
      refetchOnReconnect: false // 可选,防止网络恢复时自动重发请求
    },
  },
});

// 根组件中正确包裹应用
<QueryClientProvider client={queryClient}>
  <App />
</QueryClientProvider>

如果全局配置未生效,直接给useSession的useQuery单独加配置强制覆盖:

export function useSession() {
  return useQuery(['session', 'get'], getSession, {
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    refetchOnReconnect: false
  })
}

2. 排除加载状态误触发登录

窗口聚焦重请求时,session会暂时变为undefined(此时isLoading为true),你的useEffect没做状态判断,导致误触发登录。修改逻辑:

const { data: session, isLoading } = useSession();
const { mutate: login } = useLogin();

useEffect(() => {
  // 只在非加载状态、且明确无用户名时执行登录
  if (!isLoading && session?.username === null) {
    login({ username: "lime-app", password: "generic" });
  }
}, [session, isLoading, login]);

3. 设置staleTime减少无效请求

给会话查询配置合理的staleTime,让缓存数据在一段时间内保持有效,避免React Query频繁触发重请求:

export function useSession() {
  return useQuery(['session', 'get'], getSession, {
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    staleTime: 3600000 // 1小时,可根据业务调整时长
  })
}

4. 保留旧数据避免session临时丢失

如果仍存在重请求场景,开启keepPreviousData,让重新请求时保留旧会话数据,避免session变为undefined:

export function useSession() {
  return useQuery(['session', 'get'], getSession, {
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    keepPreviousData: true
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:20:14