React Query异步函数仅在刷新/重显页面时执行的问题咨询
问题解答
一、为什么“barney 0.5”仅在页面刷新/重新显示时打印,而“barney 0.2”每次都输出?
barney 0.2位于自定义hookuaq的顶层代码中:React组件每次渲染时,内部的hook会完整执行一遍顶层逻辑,所以只要组件触发重渲染(比如状态变化、父组件渲染),这个日志就会打印。barney 0.5位于useQuery的queryFn回调内:这个回调只有在React Query实际发起查询请求时才会执行,而非每次组件渲染都触发。React Query默认会缓存查询结果,只有满足以下场景才会执行queryFn:- 页面刷新后首次加载,且
enabled条件(e && !al && iv)为true; - 组件重新挂载(重新显示)时,缓存数据已过期或不存在;
- 查询被手动刷新(如调用
refetch)、缓存失效; enabled从false变为true。
另外,如果查询缓存始终有效(比如staleTime设置较长),React Query会直接复用缓存,不会重复执行queryFn,自然不会打印barney 0.5。
- 页面刷新后首次加载,且
二、若enabled是常量布尔值而非返回布尔值的函数,React Query如何为重试计数器重新评估该表达式?
你使用的React Query v4版本中,enabled本身仅接收布尔值(函数式enabled是v5新增特性)。针对常量布尔值的情况:
- 每次组件渲染时,React Query都会重新读取
enabled的当前值(虽然是常量,值不会发生变化)。 - 当查询失败触发重试时,React Query会先校验
enabled是否为true:- 若为常量
true:重试逻辑正常执行,重试计数器每次失败后递增,直到达到retry配置的次数上限; - 若为常量
false:查询不会被触发,重试逻辑也不会启动。
- 若为常量
- 因为是常量,所以不存在“重新评估表达式”的动态变化——只要初始值是
true,重试过程中enabled状态不会改变,重试会按配置走完;如果初始是false,整个查询流程都不会启动。
内容的提问来源于stack exchange,提问作者dstromberg
相关产品推荐
相关产品推荐

