useRequest

异步请求 Hook

Features

  • 自动请求/手动请求
  • swr
  • 监听依赖变化,重新请求
  • 防抖
  • 节流
  • 轮询
  • 错误重试

代码演示

默认请求

在组件加载时,自动触发请求。同时自动管理异步请求的 loading , data , error 等状态

请求到的时间:
Live Editor
Copy

手动触发

设置 options.manual = true, 则需要手动调用 request 时才会触发执行异步函数

请求到的时间:
Live Editor
Copy

轮询

通过设置 options.pollingInterval,进入轮询模式,定时触发函数执行

  • 通过 polling / cancel 来 开启/停止 轮询
  • options.manual=true 时,需要执行 polling 开始轮询
  • 通过设置 options.pollingWhenHidden=false ,在屏幕不可见时,暂停轮询
  • 通过设置 options.pollingWhenOffline=false(默认为 false) ,在离线时,暂停轮询
请求到的时间:
Live Editor
Copy

防抖

通过设置 options.debounceInterval,进入防抖模式

Fetched count:
Live Editor
Copy

节流

通过设置 options.throttleInterval,进入节流模式

Fetched count:
Live Editor
Copy

SWR

设置 swr = truekeykey 通过 keySerializer 得到的 cacheKey 作为缓存标识

keySerializer 规则见 key

请求到的时间:
Live Editor
Copy

Mutation

通过调用返回的 mutate,直接修改 data

函数签名见 Mutate

第二个参数 shouldRefresh 默认为 true,即突变数据后会重新发送请求

注:swr 模式下,相同 cacheKey 的数据会同步更新,详见 SWR

shouldRefresh:
Live Editor
Copy

屏幕聚焦刷新请求

如果设置了 options.refreshOnFocus=true ,在屏幕聚焦时会触发再次请求;可以设置 focusThrottleInterval 来限制触发的时间间隔,默认为 5000

请求到的时间:
Live Editor
Copy

请求条件控制

manual = false 时,当第一个参数(key)为 truthy 值类型,或者返回 truthy 值的函数,才发送请求

注意:该行为依赖于默认 keySerializer 的实现

请求到的时间:
是否请求:
Live Editor
Copy

监听依赖

manual = false 时,当根据第一个参数(key)生成的 cacheKey 变化时,重新发送请求:

注意:该行为依赖于 keySerializer 的实现

请求到的时间:
Live Editor
Copy

错误重试

设置 shouldRetryOnError=true,开启错误重试

  • 通过 errorRetryInterval 设置重试间隔,默认为 5000
  • 通过 errorRetryCount 设置最大重试次数
  • 通过 onErrorRetry 设置错误重试处理函数
请求到的时间:
第 -1 次重试(最多 5 次)
Live Editor
Copy

API

type Fetcher<T = any> = (...args: any[]) => Promise<T>
type CatchedPromise<T> = Promise<[null, T] | [Error, null]>
type CatchedFetcher<T = any> = (...args: any[]) => CatchedPromise<T>
type useRequest = {
<T>(
key: any,
options?: Options<T>
): Result<T>
<T>(
key: any,
fetcher: Fetcher<T>,
options?: Options<T>
): Result<T>
}

key

key 的作用:

  • key 通过 keySerializer 转换为缓存标识(cacheKey)和请求方法(fetcher)参数
  • 控制请求条件:key 根据 keySerializer 转换成的 cacheKeyfalsy 值时,请求不发送
  • 根据依赖刷新请求:key 根据 keySerializer 转换成的 cacheKey 变化时,重新发送请求

默认 keySerializer 的规则:

  • 除了抛出错误的函数外,key = <value> 等同于 key = () => <value>,当 <value> 数据量很大时,建议使用 key = () => <value>
  • keyfalsy 值或返回 falsy 值的函数或抛出错误的函数时,转换成的 cacheKeynull
  • key 为对象时,深度序列化后的值不变,则转换成的 cacheKey 不变
  • key 为数组时,数组项不变(数组项为对象时,深度序列化后再比较),则转换成的 cacheKey 不变

Options

参数均为可选

参数说明类型默认值
manual是否手动调用请求方法,通过调用返回的 request 方法booleanfalse
initialData初始数据T | nullnull
keySerializerkey 的转换函数,传入 key,返回 [cacheKey, fetcherArgs](key: any) => [string | null, any[] | null]-
swr是否使用 swr 模式booleanfalse
debounceInterval防抖间隔, 单位为毫秒,设置后,请求进入防抖模式number-
debounceOptions防抖参数,maxWait 设置延迟的最大值{ maxWait?: number }-
throttleInterval节流间隔, 单位为毫秒,设置后,请求进入节流模式number-
pollingInterval轮询间隔number-
pollingWhenHidden在页面隐藏时,是否继续轮询booleantrue
pollingWhenOffline在离线时,是否继续轮询booleanfalse
pollingWhenError请求报错时,是否继续轮询,当设置为 falseshouldRetryOnError = true 时,重试得到成功响应后,继续轮询booleanfalse
refreshOnReconnect是否在网络连接上后刷新请求booleantrue
refreshOnFocus页面重新获取焦点时,是否触发 refreshbooleanfalse
focusThrottleInterval获取焦点事件在指定时间间隔内只触发一次 refreshnumber5000
shouldRetryOnError请求失败时是否重试booleanfalse
errorRetryInterval重试间隔number5000
errorRetryCount最大重试次数number-
onErrorRetry错误重试处理函数(error: Error, key, options: Options, request, requestOptions: {retryCount: number; forPolling: boolean}) => void-

Result

参数说明类型
data请求返回的数据T
error请求错误Error
loading表示是否在请求中boolean
retrying表示是否在重试中boolean
request手动调用方法Function
params请求方法参数数组any[]
cancel取消当前请求的函数方法() => void
mutate手动修改返回的dataMutate

Mutate

type Mutate = (data: T | ((oldData: T) => T) | Promise<T>, shouldRefresh: boolean) => void