useQuery

const {
  data,
  dataUpdatedAt,
  error,
  errorUpdatedAt,
  failureCount,
  failureReason,
  fetchStatus,
  isError,
  isFetched,
  isFetchedAfterMount,
  isFetching,
  isInitialLoading,
  isLoading,
  isLoadingError,
  isPaused,
  isPending,
  isPlaceholderData,
  isRefetchError,
  isRefetching,
  isStale,
  isSuccess,
  isEnabled,
  promise,
  refetch,
  status,
} = useQuery(
  {
    queryKey,
    queryFn,
    gcTime,
    enabled,
    networkMode,
    initialData,
    initialDataUpdatedAt,
    meta,
    notifyOnChangeProps,
    placeholderData,
    queryKeyHashFn,
    refetchInterval,
    refetchIntervalInBackground,
    refetchOnMount,
    refetchOnReconnect,
    refetchOnWindowFocus,
    retry,
    retryOnMount,
    retryDelay,
    select,
    staleTime,
    structuralSharing,
    subscribed,
    throwOnError,
  },
  queryClient,
)

参数1(配置项 Options)

  • queryKey: unknown[]

    • 必需

    • 用于标识此查询的键。

    • 查询键将被哈希为一个稳定字符串。详见 查询键(Query Keys)。

    • 当此键发生变化时(且 enabled 不为 false),查询会自动重新执行。

  • queryFn: (context: QueryFunctionContext) => Promise<TData>

    • 必需,除非已定义了默认查询函数(见默认查询函数)

    • 查询用于请求数据的函数。

    • 接收一个 QueryFunctionContext 参数。

    • 必须返回一个 Promise,该 Promise 要么解析出数据,要么抛出错误。数据不能为 undefined

  • enabled: boolean | (query: Query) => boolean

    • 设为 false 可阻止查询自动运行。

    • 常用于实现依赖查询(Dependent Queries)。

  • networkMode: 'online' | 'always' | 'offlineFirst'

    • 可选

    • 默认值:'online'

    • 更多信息见 网络模式(Network Mode)。

  • retry: boolean | number | (failureCount: number, error: TError) => boolean

    • 若为 false,失败的查询将不会重试。

    • 若为 true,失败的查询将无限次重试。

    • 若设为数字(如 3),则最多重试指定次数。

    • 默认值:客户端为 3,服务端为 0

  • retryOnMount: boolean

    • 若设为 false,组件挂载时即使有错误也不会重试查询。默认为 true

  • retryDelay: number | (retryAttempt: number, error: TError) => number

    • 接收重试次数和错误对象,返回下次重试前的延迟时间(毫秒)。

    • 示例:

      • 指数退避:attempt => Math.min(attempt > 1 ? 2 ** attempt * 1000 : 1000, 30 * 1000)

      • 线性退避:attempt => attempt * 1000

  • staleTime: number | 'static' | ((query: Query) => number | 'static')

    • 可选,默认值:0

    • 数据被视为“过期”的毫秒时间。仅对当前 hook 生效。

    • 若为 Infinity,数据永不视为过期(除非手动失效)。

    • 若为 'static',数据永不视为过期。

    • 若为函数,则传入 query 对象以动态计算 staleTime

  • gcTime: number | Infinity

    • 默认值:5 * 60 * 1000(5 分钟),SSR 期间为 Infinity

    • 未使用或非活跃缓存数据在内存中保留的时间(毫秒)。当缓存变为非活跃状态后,将在该时间后被垃圾回收。

    • 注意:最大允许时间为约 24 天,但可通过 timeoutManager.setTimeoutProvider 绕过限制。

    • 若设为 Infinity,则禁用垃圾回收。

  • queryKeyHashFn: (queryKey: QueryKey) => string

    • 可选

    • 自定义查询键的哈希函数。

  • refetchInterval: number | false | ((query: Query) => number | false | undefined)

    • 可选

    • 若为数字,查询将按该毫秒频率持续轮询。

    • 若为函数,则传入 query 对象以动态计算轮询频率。

  • refetchIntervalInBackground: boolean

    • 可选

    • 若为 true,即使页面处于后台标签页,也会继续按 refetchInterval 轮询。

  • refetchOnMount: boolean | "always" | ((query: Query) => boolean | "always")

    • 可选,默认值:true

    • true:若数据已过期,组件挂载时重新获取。

    • false:不重新获取。

    • "always":总是重新获取(除非 staleTime: 'static')。

    • 函数形式:传入 query 计算返回值。

  • refetchOnWindowFocus: boolean | "always" | ((query: Query) => boolean | "always")

    • 可选,默认值:true

    • true:窗口获得焦点且数据过期时重新获取。

    • false:不重新获取。

    • "always":总是重新获取(除非 staleTime: 'static')。

    • 函数形式:传入 query 计算返回值。

  • refetchOnReconnect: boolean | "always" | ((query: Query) => boolean | "always")

    • 可选,默认值:true

    • true:网络重连且数据过期时重新获取。

    • false:不重新获取。

    • "always":总是重新获取(除非 staleTime: 'static')。

    • 函数形式:传入 query 计算返回值。

  • notifyOnChangeProps: string[] | "all" | (() => string[] | "all" | undefined)

    • 可选

    • 若设置,组件仅在指定属性变化时才重新渲染。

    • 例如 ['data', 'error']:仅当 dataerror 变化时更新。

    • "all":关闭智能追踪,任何查询更新都触发渲染。

    • 函数形式:动态生成属性列表。

    • 默认行为:自动追踪访问的属性,仅在其变化时重新渲染。

  • select: (data: TData) => unknown

    • 可选

    • 用于转换或选择部分数据。影响返回的 data,但不影响缓存中的原始数据。

    • select 函数仅在 data 改变或其自身引用改变时执行。建议使用 useCallback 优化。

  • initialData: TData | () => TData

    • 可选

    • 若设置,将作为查询缓存的初始数据(前提是该查询尚未创建或缓存)。

    • 若为函数,会在共享/根查询初始化时同步调用一次

    • 初始数据默认是“过期”的,除非设置了 staleTime

    • initialData 会被持久化到缓存中

  • initialDataUpdatedAt: number | (() => number | undefined)

    • 可选

    • 表示 initialData 最后一次更新的时间戳(毫秒)。

  • placeholderData: TData | (previousValue: TData | undefined, previousQuery: Query | undefined) => TData

    • 可选

    • 在查询处于 pending 状态时,作为占位数据使用。

    • placeholderData 不会被持久化到缓存中

    • 若为函数,第一个参数是之前查询的数据(如有),第二个是之前的 query 实例。

  • structuralSharing: boolean | (oldData: unknown | undefined, newData: unknown) => unknown

    • 可选,默认值:true

    • 若为 false,则禁用结构共享。

    • 若为函数,传入新旧数据,返回合并后的结果。可用于保留旧数据引用以提升性能。

  • subscribed: boolean

    • 可选,默认值:true

    • 若为 false,此 useQuery 实例将不订阅缓存,即不会主动触发 queryFn,也不会接收其他方式写入缓存的数据更新。

  • throwOnError: undefined | boolean | (error: TError, query: Query) => boolean

    • true:在渲染阶段抛出错误,传递给最近的错误边界。

    • false:禁用 Suspense 的错误抛出行为,错误作为状态返回。

    • 函数形式:决定是否将错误抛向错误边界(true)还是作为状态处理(false)。

  • meta: Record<string, unknown>

    • 可选

    • 存储额外元信息,可在 query 可用处访问,也包含在 QueryFunctionContext 中。


参数2(QueryClient)

  • queryClient?: QueryClient

    • 用于指定自定义的 QueryClient 实例。若未提供,则使用最近上下文中的 QueryClient


返回值(Returns)

  • status: QueryStatus

    • 查询状态:

      • pending:无缓存数据且尚未完成首次请求。

      • error:请求失败。对应的 error 属性包含错误对象。

      • success:请求成功,可展示数据。对应的 data 属性为成功获取的数据;若 enabledfalse 且未请求过,data 为初始化时传入的 initialData

  • isPending: boolean

    • 根据 status 派生的布尔值,表示是否处于 pending 状态。

  • isSuccess: boolean

    • 表示是否处于 success 状态。

  • isError: boolean

    • 表示是否处于 error 状态。

  • isLoadingError: boolean

    • 首次获取数据失败时为 true

  • isRefetchError: boolean

    • 后续刷新数据失败时为 true

  • data: TData

    • 默认为 undefined

    • 最近一次成功获取的数据。

  • dataUpdatedAt: number

    • 上次查询状态变为 "success" 的时间戳。

  • error: null | TError

    • 默认为 null

    • 查询失败时的错误对象。

  • errorUpdatedAt: number

    • 上次查询状态变为 "error" 的时间戳。

  • isStale: boolean

    • 若缓存数据已被标记为无效或超过 staleTime,则为 true

  • isPlaceholderData: boolean

    • 若当前显示的是占位数据,则为 true

  • isFetched: boolean

    • 若查询已被获取过,则为 true

  • isFetchedAfterMount: boolean

    • 若组件挂载后查询已被获取,则为 true

    • 可用于避免显示挂载前的缓存数据。

  • fetchStatus: FetchStatus

    • fetchingqueryFn 正在执行(包括首次加载和后台刷新)。

    • paused:本应获取,但因网络等原因暂停。

    • idle:未在获取。

  • isFetching: boolean

    • 根据 fetchStatus 派生,表示是否正在获取。

  • isPaused: boolean

    • 表示是否处于暂停状态。

  • isRefetching: boolean

    • 后台刷新进行中时为 true(不包括首次加载)。

    • 等价于 isFetching && !isPending

  • isLoading: boolean

    • 首次获取数据进行中时为 true

    • 等价于 isFetching && isPending

  • isInitialLoading: boolean

    • 已弃用

    • isLoading 的别名,将在下一主要版本中移除。

  • isEnabled: boolean

    • 若此查询观察者已启用,则为 true

  • failureCount: number

    • 查询失败次数。每次失败递增,成功时重置为 0

  • failureReason: null | TError

    • 本次重试的失败原因。成功时重置为 null

  • errorUpdateCount: number

    • 所有错误事件的总数。

  • refetch: (options: { throwOnError: boolean, cancelRefetch: boolean }) => Promise<UseQueryResult>

    • 手动重新获取数据的函数。

    • 若查询失败,错误默认仅被记录。若希望抛出错误,需传入 throwOnError: true

    • cancelRefetch?: boolean

      • 默认 true:若有正在进行的请求,先取消再发起新请求。

      • false:若已有请求在运行,则不发起新请求。

  • promise: Promise<TData>

    • 一个稳定的 Promise,将在查询数据就绪时解析。

    • 需要在 QueryClient 上启用 experimental_prefetchInRender 实验性功能标志才可用。


注意:本文档基于 React Query 的 API 设计,适用于 v4 或更高版本。具体行为请参考官方文档及实际项目配置。

最后更新于

这有帮助吗?