【React Query】useQuery 快速入门

​​​​logo

React Query通常被描述为React缺少的数据获取库,但从技术上讲,它使React应用程序中的获取、缓存、同步和更新服务器状态变得轻而易举。

useQuery是react-query最常用的hook,没有之一。

一、使用方式

const {
   data,
   dataUpdatedAt,
   error,
   errorUpdatedAt,
   failureCount,
   isError,
   isFetched,
   isFetchedAfterMount,
   isFetching,
   isIdle,
   isLoading,
   isLoadingError,
   isPlaceholderData,
   isPreviousData,
   isRefetchError,
   isRefetching,
   isStale,
   isSuccess,
   refetch,
   remove,
   status,
 } = useQuery(queryKey, queryFn?, {
   cacheTime,
   enabled,
   initialData,
   initialDataUpdatedAt
   isDataEqual,
   keepPreviousData,
   meta,
   notifyOnChangeProps,
   notifyOnChangePropsExclusions,
   onError,
   onSettled,
   onSuccess,
   placeholderData,
   queryKeyHashFn,
   refetchInterval,
   refetchIntervalInBackground,
   refetchOnMount,
   refetchOnReconnect,
   refetchOnWindowFocus,
   retry,
   retryOnMount,
   retryDelay,
   select,
   staleTime,
   structuralSharing,
   suspense,
   useErrorBoundary,
 })
 
 // or using the object syntax
 
 const result = useQuery({
   queryKey,
   queryFn,
   enabled,
 })

二、Options

  • queryKey: string | unknown[]

    • 必填项
    • 用于该查询的查询键,并且对查询的数据来说它是唯一的
    • 键值可以像字符串一样简单,也可以像由许多字符串和嵌套对象组成的数组一样复杂
    • 当此键更改时,查询将自动更新(只要enabled未设置为false)

    queryKey作为唯一键值将在React Query内部用于在整个程序中重新获取数据、缓存和共享查询,因此你可以使用特定的key来缓存某些特定的接口数据。而且queryKey的更改会导致查询更新,因此你可以将接口字段设置为queryKey,比如:useQuery([‘todos’, { page, status }], …)

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

    • 必填项,(当定义默认查询函数后可不填)
    • 查询将用于请求数据的函数。
    • 接收具有以下变量的QueryFunctionContext对象
    • 必须返回将解析数据或抛出错误的承诺
  • enabled: boolean

    • false时queryFn将不会自动执行
    • 有时候我们可以根据特定参数来判断是否执行该查询
 // 获取用户
 const { data: user } = useQuery(['user', email], getUserByEmail)
 
 const userId = user?.id
 
 // 获取该用户的项目
 const { isIdle, data: projects } = useQuery(
   ['projects', userId],
   getProjectsByUser,
   {
     // 在userId获取到之前,查询不会执行
     enabled: !!userId,
   }
 )
  • retry: boolean | number | (failureCount: number, error: TError) => boolean

    • true: 查询失败后将无限重复查询
    • false: 默认情况下不会重试失败的查询
    • number: 失败的查询将重试,直到失败的查询计数满足该数字
  • retryOnMount: boolean

    • 默认为true,如果设置为false,则在组件加载时如果有错误,将不会重新查询
  • retryDelay: number | (retryAttempt: number, error: TError) => number

    • 重新查询的延迟时间
  • staleTime: number | Infinity

    • 可选,默认为0
    • 数据被认为过期后的时间(毫秒)
    • 如果设置为Infinity,数据将永远不会被认为过期
  • cacheTime: number | Infinity

    • 默认值为5分钟
    • 查询的缓存数据未使用超过该时长后,缓存数据将被回收
    • 如果设置为Infinity,将禁止数据回收
  • queryKeyHashFn: (queryKey: QueryKey) => string

    • 可选
    • 如果指定,该函数用于将queryKey处理为字符串
  • refetchInterval: number | false | ((data: TData | undefined, query: Query) => number | false)

    • 可选
    • 如果设置为数字,则所有查询将以毫秒为单位,以该频率连续刷新
    • 如果设置为函数,则将使用最新的数据和查询执行该函数,以计算频率
  • refetchIntervalInBackground: boolean

    • 可选
    • 如果设置为true,则在选项卡/窗口处于后台运行时继续触发refetchInterval
  • refetchOnMount: boolean | “always” | ((query: Query) => boolean | “always”)

    • 可选,默认为true
    • 如果设置为true,则如果数据过期,查询将在组件加载时重新执行
    • 如果设置为false,则查询将不会在组件加载时重新执行
    • 如果设置为"always",则查询将始终在组件加载时重新执行
    • 如果设置为函数,则将使用查询执行该函数以计算值
  • refetchOnWindowFocus: boolean | “always” | ((query: Query) => boolean | “always”)

    • 可选,默认为true
    • 如果设置为true,则窗口获得焦点时如果数据过期,查询将重新获取
    • 如果设置为false,则窗口获得焦点时,查询将不会重新获取
    • 如果设置为“始终”,则窗口获得焦点时,询将始终重新获取
    • 如果设置为函数,则将使用查询执行该函数以计算值
  • refetchOnReconnect: boolean | “always” | ((query: Query) => boolean | “always”)

    • 可选,默认为true
    • 如果设置为true,则如果数据过期,则查询将在重新连接时重新执行
    • 如果设置为false,则在重新连接时查询将不会重新执行
    • 如果设置为“始终”,则查询将始终在重新连接时重新连接
    • 如果设置为函数,则将使用查询执行该函数以计算值
  • notifyOnChangeProps: string[] | “tracked”

    • 可选
    • 如果设置,则仅当列出的任何属性发生更改时,组件才会重新渲染
    • 例如,如果设置为[‘data’,‘error’],则只有当数据或错误属性更改时,组件才会重新渲染。
    • 如果设置为“tracked”,则将跟踪对属性的访问,并且只有在跟踪的属性之一发生更改时,组件才会重新渲染。
  • notifyOnChangePropsExclusions: string[]

    • 可选
    • 如果设置,则如果列出的任何属性发生更改,组件将不会重新渲染。
    • 例如,如果设置为[‘isTale’],当isStale属性更改时,组件将不会重新渲染。
  • onSuccess: (data: TData) => void

    • 可选
    • 每当查询成功获取新数据或通过setQueryData更新缓存时,此函数都会执行
  • onError: (error: TError) => void

    • 可选
    • 如果查询遇到错误并将传递错误,则此函数将执行
  • onSettled:(data?: TData, error?: TError) => void

    • 可选
    • 此函数将在查询成功获取或出错时启动,并传递数据或错误
  • select: (data: TData) => unknown

    • 可选
    • 此选项可用于转换或选择查询函数返回的部分数据
  • suspense: boolean

    • 可选
    • 将此设置为true以启用悬念模式。
    • 如果为true,则当 status==“loading” 时,useQuery将挂起
    • 如果为true,则当 status==“error” 时,useQuery将抛出运行时错误
  • initialData: TData | () => TData

    • 可选
    • 如果设置了,则作为查询缓存的初始数据(只要尚未创建或缓存查询)
    • 如果设置为函数,则在共享/根查询初始化期间将调用该函数一次,并期望同步返回initialData
      • 默认情况下,除非设置了staleTime,否则初始数据将被视为过时。
      • initialData持久化到缓存
  • initialDataUpdatedAt: number | (() => number | undefined)

    • 可选
    • 如果设置了该值,则该值将用作initialData自身上次更新的时间(以毫秒为单位)。
  • placeholderData: TData | () => TData

    • 可选
    • 如果设置了该值,则当查询仍在加载数据中且未提供initialData时,该值将用作此特定查询观察者的占位符数据。
    • 占位符数据未持久化到缓存
  • keepPreviousData: boolean

    • 可选,默认为false
    • 如果设置,则在获取新数据时,将保留所有以前的数据,因为查询键已更改
  • structuralSharing: boolean

    • 可选,默认为true
    • 如果设置为false,将禁用查询结果之间的结构共享
  • useErrorBoundary: undefined | boolean | (error: TError, query: Query) => boolean

    • 默认为全局查询配置的useErrorBoundary值,为 undefined
      • 如果希望在渲染阶段抛出错误并传播到最近的错误边界,请将此设置为true
      • 将此设置为false可禁用suspend向错误边界抛出错误的默认行为。
      • 如果设置为函数,它将传递错误和查询,并且应该返回一个布尔值,指示是在错误边界中显示错误(true)还是将错误作为状态返回(false)
  • meta: Record<string, unknown>

    • 可选
    • 如果已设置,则存储有关查询缓存项的附加信息,可根据需要使用这些信息。它将在查询可用的任何地方都可以访问,并且也是提供给queryFn的QueryFunctionContext的一部分

三、Returns

  • status: String

    • idle: 空闲。只有在使用enabled:false初始化查询并且没有可用的初始数据时,才会出现这种情况
    • loading: 加载中。这意味着没有缓存数据,并且查询当前正在获取,例如isFetching==true
    • error: 查询返回结果抛出错误
    • success: 如果查询已收到无错误的响应并准备好显示其数据,则为成功。查询上对应的数据属性是从成功获取中接收的数据,或者如果查询的enabled属性设置为false并且尚未获取,则数据是初始化时提供给查询的第一个initialData
  • isIdle: boolean

    • 从上述 status 变量衍射的布尔值,为方便起见提供
  • isLoading: boolean

    • 从上述 status 变量衍射的布尔值,为方便起见提供
  • isSuccess: boolean

    • 从上述 status 变量衍射的布尔值,为方便起见提供
  • isError: boolean

    • 从上述 status 变量衍射的布尔值,为方便起见提供
  • isLoadingError: boolean

    • 如果第一次执行时查询失败,则为true
  • isRefetchError: boolean

    • 如果重新查询时查询失败,则为true
  • data: TData

    • 默认 undefined
    • 上次成功解析查询的数据
  • dataUpdatedAt: number

    • 查询最近返回状态为“成功”的时间戳
  • error: null | TError

    • 默认 null
    • 如果抛出错误,则返回查询的错误对象。
  • errorUpdatedAt: number

    • 查询最近返回状态为“error”的时间戳
  • isStale: boolean

    • 如果缓存中的数据无效或数据早于给定的staleTime,则为true
  • isPlaceholderData: boolean

    • 如果显示的数据是占位符数据,则为true
  • isPreviousData: boolean

    • 当设置keepPreviousData并返回上一个查询的数据时,将为true
  • isFetched: boolean

    • 如果已执行查询,则为true
  • isFetchedAfterMount: boolean

    • 如果在加载组件后提取了查询,则为true
    • 此属性可用于不显示任何以前缓存的数据
  • isFetching: boolean

    • 无论何时请求正在运行,都是true,这包括初始加载和后台引用。
    • 如果查询当前正在获取(包括后台获取),则为true。
  • isRefetching: boolean

    • 当后台重新加载正在进行时(不包括初始加载)为true
    • 与 (isFetching && !isLoading) 相同
  • failureCount: number

    • 查询的失败计数
    • 每次查询失败时递增
    • 查询成功时重置为0
  • errorUpdateCount: number

    • 所有错误的总和
  • refetch: (options: { throwOnError: boolean, cancelRefetch: boolean }) => Promise

    • 手动重新执行查询的函数
    • 如果查询错误,则只记录错误。如果希望抛出错误,请传递throwOnError:true选项
    • 如果cancelRefetch为true,则在发出新请求之前将取消当前请求
  • remove: () => void

    • 从缓存中删除查询的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值