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

React Query设置initialData后queryFn不执行的原因咨询

React Query中配置initialData后queryFn不执行的原因分析

我在使用React Query时需要设置默认数据,配置initialData后发现queryFn完全没被调用,连带着onSuccess回调也无法执行,useQuery返回的数据一直停留在initialData设置的初始值。

我的代码如下:

const getProducts = () => {
    console.log("from getProducts");
    //Fetch data
}

export const useProducts = () =>
    useQuery({
        queryKey: ["AllProducts"],
        cacheTime: Infinity,
        staleTime: Infinity,
        initialData: {
            products: [],
        },
        queryFn: () => getProducts(),
        onSuccess: (data) => {
            console.log("from onSuccess");
            // Do some stuff
        }
    })

奇怪的是console.log("from getProducts");和console.log("from onSuccess");都没有输出。我知道改用placeholderData替代initialData后功能正常,但想搞清楚出现这个现象的原因。

使用的React Query及开发者工具版本:

"@tanstack/react-query": "^4.29.12",
"@tanstack/react-query-devtools": "^4.29.12",

核心原因:initialData会被视为缓存的"新鲜数据"

当你配置initialData时,React Query会把这个值直接存入对应queryKey的缓存中,再加上你设置的staleTime: Infinity,这条缓存数据会被永久标记为"新鲜(fresh)"状态。

React Query的查询触发逻辑是:只有缓存中没有对应数据,或者数据处于"过时(stale)"状态时,才会调用queryFn获取最新数据。而你这里缓存已经有了initialData提供的新鲜数据,所以完全不会触发后台请求。

initialData和placeholderData的本质区别

  • initialData:属于缓存的一部分,会被持久化到缓存中,后续查询优先使用它,直到数据超过staleTime变陈旧。
  • placeholderData:只是临时占位数据,不会写入缓存,不管有没有设置staleTime,React Query都会正常调用queryFn拉取真实数据,同时在数据返回前用占位数据渲染UI。

你设置的staleTime: Infinity进一步固化了这个行为——缓存数据永远不会过时,所以queryFn永远没有执行的机会。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:02