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

React Query持久化Mutation登录数据后查询呈inactive状态问题求助

问题分析与修复

你的代码存在三处关键错误,导致持久化登录数据无法正常读取:

1. 持久化逻辑完全写反

在main.jsx的shouldDehydrateQuery配置中,你设置了排除需要持久化的USER查询,导致登录数据根本没被存入localStorage:

// 原错误代码
shouldDehydrateQuery: ({ queryKey }) =>
  findIndex(values(PERSISTED_QUERY_KEYS), (v) => isEqual(v, queryKey)) === -1

这个条件的意思是:只有当queryKey不在PERSISTED_QUERY_KEYS里时,才会持久化该查询。而我们需要的是只持久化USER查询,所以要把判断条件反过来:

// 修复后
shouldDehydrateQuery: ({ queryKey }) =>
  findIndex(values(PERSISTED_QUERY_KEYS), (v) => isEqual(v, queryKey)) !== -1

2. useQuery缺少必填的queryFn

useAuthenticatedUser.js中的useQuery没有提供queryFn,这会导致查询始终处于inactive/idle状态——React Query无法识别这是一个有效查询,即使缓存中有数据,也无法正确读取或维持激活状态。

你需要添加queryFn,如果后端有获取当前用户信息的接口,直接写请求逻辑;如果不需要后台验证,也可以返回缓存中的数据:

// useAuthenticatedUser.js 修复后
const useAuthenticatedUser = () => {
  const queryClient = useQueryClient();
  const { data, status } = useQuery({
    queryKey: PERSISTED_QUERY_KEYS.USER,
    // 添加queryFn,示例为返回缓存数据(根据实际业务替换为真实接口请求)
    queryFn: () => Promise.resolve(queryClient.getQueryData(PERSISTED_QUERY_KEYS.USER)),
    // 设置staleTime为无穷大,避免自动触发无效请求
    staleTime: Infinity,
  });

  useEffect(() => {
    console.log("useAuthenticatedUser data: ", data);
  }, [data]);

  return {
    authenticatedUserData: data,
    status, // 返回状态用于判断数据是否加载完成
  };
};

3. SignIn中多余的invalidateQueries

在SignIn.jsx的onSuccess里,你先调用了invalidateQueries,这会尝试重新执行USER查询,但因为缺少queryFn,这一步不仅无效,还可能清空缓存数据。直接去掉即可:

// SignIn.jsx onSuccess修复后
onSuccess: ({ data }) => {
  console.log("Sign in data: ", data);
  // 移除invalidateQueries,直接设置缓存数据
  queryClient.setQueryData(PERSISTED_QUERY_KEYS.USER, data);
  navigate("/home", { replace: true });
},

额外优化:处理持久化异步恢复

因为PersistQueryClientProvider从localStorage恢复数据是异步的,初始加载时authenticatedUserData会是undefined,可能导致错误跳转。在Root.jsx中加入状态判断,等待数据恢复完成:

// Root.jsx 修复后
const navigate = useNavigate();
const { authenticatedUserData, status } = useAuthenticatedUser();

useEffect(() => {
  // 等待持久化数据加载完成,避免初始状态错误跳转
  if (status === 'loading') return;
  navigate(authenticatedUserData ? "/home" : "/signIn", { replace: true });
}, [authenticatedUserData, status]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:45:53