Skip to content

useDebounceFn

Category
Export Size
372 B
Last Changed
6 months ago
Related

延迟执行函数。

延迟是一个被过载的服务员:如果你不停地问他问题,直到你停下来并给他一些时间来考虑你最新的问题,他将会忽略你的请求。

Demo

此演示中延迟设置为 1000ms,最大等待时间设置为 5000ms。

按钮点击次数:0

事件处理程序调用次数:0

使用方法

js
import { useDebounceFn } from '@vueuse/core'

const debouncedFn = useDebounceFn(() => {
  // 做一些事情
}, 1000)

window.addEventListener('resize', debouncedFn)

你还可以传递第三个参数给它,带有一个最大等待时间,类似于 lodash debounce

js
import { useDebounceFn } from '@vueuse/core'

// 如果在重复输入后 5000ms 内没有调用,该函数将被调用。
const debouncedFn = useDebounceFn(() => {
  // 做一些事情
}, 1000, { maxWait: 5000 })

window.addEventListener('resize', debouncedFn)

此外,你可以使用 promise 操作获取函数的返回值。

js
import { useDebounceFn } from '@vueuse/core'

const debouncedRequest = useDebounceFn(() => 'response', 1000)

debouncedRequest().then((value) => {
  console.log(value) // 'response'
})

// 或者使用 async/await
async function doRequest() {
  const value = await debouncedRequest()
  console.log(value) // 'response'
}

由于未处理的拒绝错误在开发者不需要返回值时相当烦人,promise 在默认情况下如果函数被取消,则不会被拒绝。你需要指定选项 rejectOnCancel: true 来捕获拒绝。

js
import { useDebounceFn } from '@vueuse/core'

const debouncedRequest = useDebounceFn(() => 'response', 1000, { rejectOnCancel: true })

debouncedRequest()
  .then((value) => {
    // 做一些事情
  })
  .catch(() => {
    // 在被取消时做一些事情
  })

// 再次调用将取消前一个请求并被拒绝
setTimeout(debouncedRequest, 500)

推荐阅读

类型声明

typescript
/**
 * 延迟执行函数。
 *
 * @see https://vueuse.org/useDebounceFn
 * @param  fn          要在延迟毫秒后执行的函数。
 * @param  ms          毫秒为单位的延迟时间,必须为零或更大。对于事件回调,最有用的值大约为 100 或 250(甚至更高)。
 * @param  options     选项
 *
 * @return 一个新的延迟函数。
 */
export declare function useDebounceFn<T extends FunctionArgs>(
  fn: T,
  ms?: MaybeRefOrGetter<number>,
  options?: DebounceFilterOptions,
): PromisifyFn<T>

Source

SourceDemoDocs

贡献者

Anthony Fu
丶远方
Anthony Fu
vaakian X
azaleta
Joe Maylor
Jakub Freisler
wheat

变更日志

v10.0.0-beta.4 on 4/13/2023
4d757 - feat(types)!: rename MaybeComputedRef to MaybeRefOrGetter
v9.10.0 on 1/3/2023
4d305 - feat(useDebounceFn,useThrottleFn): return result using promise (#2580)

Released under the MIT License.