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

使用useQuery时如何保留之前成功获取的数据?

解决请求失败时旧数据被重置的问题

要搞定这个问题,你可以借助React Query的配置项来保留历史数据,下面是两种实用方案:

方案一:开启keepPreviousData(推荐)

这个配置会在新请求发起(不管成功还是失败)时,保留上一次成功获取的数据,直到新请求拿到有效结果。修改你的useQuery代码:

import queryString from "query-string";
import { useRouter } from "next/router";
  
const { query } = useRouter();

const { data: statsData, isLoading: statsLoading, isError } = useQuery(
    ["stats", queryString.stringify(query)],
    ({ queryKey }) =>
      axios.get(`/statistics?${queryKey[1]}`).then(({ data }) => data),
    {
      onError: () => showErrMessage("500"),
      keepPreviousData: true, // 新增这行配置
    }
);

这样哪怕新请求失败,statsData依然会保留之前成功请求返回的数据,不会变成空值。

方案二:设置staleTime延长数据有效期

如果你的数据不需要实时更新,可以通过staleTime设置一段有效期,在这段时间内,即使请求失败,React Query也不会清空已有的数据:

const { data: statsData, isLoading: statsLoading } = useQuery(
    ["stats", queryString.stringify(query)],
    ({ queryKey }) =>
      axios.get(`/statistics?${queryKey[1]}`).then(({ data }) => data),
    {
      onError: () => showErrMessage("500"),
      staleTime: 5 * 60 * 1000, // 数据5分钟内视为有效,不会因请求失败清空
    }
);

额外小技巧

你可以配合isError状态给用户显示错误提示,同时正常展示旧数据:

{isError && <div>数据加载失败,请稍后重试</div>}
{statsData?.total_sales}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:14