Skip to content

防抖 debounce

赞助

对于短时间内连续触发的事件,防抖保证在停止触发 delay ms 后才执行一次

何时使用

  • 对于短时间内连续触发的事件,停止触发 delay ms 后函数才执行一次
Show Source Code
ts
/**
 * 防抖函数 debounce
 *
 * 主要用于限制函数调用的频率,当频繁触发某个函数时,实际上只需要在最后一次触发后的一段时间内执行一次即可
 * 这对于诸如输入事件处理函数、窗口大小调整事件处理函数等可能会频繁触发的函数非常有用
 *
 * @param {Function} fn 要执行的函数
 * @param {number} [delay = 300] 防抖的时间期限,单位 ms,默认为 300ms
 * @returns {Function} 返回一个新的防抖的函数
 */
export function debounce(fn: Function, delay: number = 300): Function {
  let timer: any = null // 使用闭包保存定时器的引用
  return function (...args: any[]) {
    // 返回一个包装函数
    if (timer) {
      // 如果定时器存在,则清除之前的定时器
      clearTimeout(timer)
    }
    // 设置新的定时器,延迟执行原函数
    timer = setTimeout(() => {
      fn(...args)
    }, delay)
  }
}

基本使用

滚动条位置:0

vue
<script setup lang="ts">
import { ref } from 'vue'
import { debounce, useEventListener } from 'vue-amazing-ui'
const scrollTop = ref(0)
// SSR(Node)环境无 window,需判断存在性后再注册监听
if (typeof window !== 'undefined') {
  useEventListener(window, 'scroll', debounce(showPosition, 100))
}
function showPosition() {
  scrollTop.value = window.pageYOffset || document.documentElement.scrollTop
}
</script>

Params

参数说明类型默认值
fn要执行的函数Functionundefined
delay防抖的时间期限,单位 msnumber300

Return

类型说明
Function防抖后的新函数

Released under the MIT License.