以下是一个基于Vue3的防抖节流指令的实现:

import { onMounted, onUnmounted } from 'vue'

const debounce = (fn, delay = 500) => {
  let timer = null
  return function() {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      fn.apply(this, arguments)
      timer = null
    }, delay)
  }
}

const throttle = (fn, interval = 500) => {
  let timer = null
  let now = Date.now()
  return function() {
    const context = this
    const args = arguments
    const elapsed = Date.now() - now
    if (elapsed >= interval) {
      fn.apply(context, args)
      now = Date.now()
    } else {
      if (timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        fn.apply(context, args)
        now = Date.now()
      }, interval - elapsed)
    }
  }
}

const debounceDirective = {
  mounted(el, binding) {
    const { value, arg } = binding
    const delay = arg ? parseInt(arg, 10) : 500
    const debounced = debounce(value, delay)
    el._debounced = debounced
    el.addEventListener('input', debounced)
  },
  unmounted(el) {
    el.removeEventListener('input', el._debounced)
    el._debounced = null
  },
}

const throttleDirective = {
  mounted(el, binding) {
    const { value, arg } = binding
    const interval = arg ? parseInt(arg, 10) : 500
    const throttled = throttle(value, interval)
    el._throttled = throttled
    el.addEventListener('input', throttled)
  },
  unmounted(el) {
    el.removeEventListener('input', el._throttled)
    el._throttled = null
  },
}

const useDebounce = debounce
const useThrottle = throttle

export { debounceDirective, throttleDirective, useDebounce, useThrottle }

在上面的代码中,我们先实现了一个 debouncethrottle 函数,分别用于防抖和节流。然后我们定义了两个指令 debounceDirectivethrottleDirective,分别对应防抖和节流。这两个指令在 mounted 阶段会添加监听器,当触发事件时会执行防抖或节流函数。在 unmounted 阶段则移除监听器。

最后,我们还导出了 useDebounceuseThrottle 两个函数,可以在 Vue 组件中使用,用于自定义防抖或节流函数。例如:

import { useDebounce } from './debounce-throttle'

export default {
  setup() {
    const search = useDebounce((query) => {
      // 发送搜索请求
    }, 500)
    return {
      search,
    }
  },
}

在上面的代码中,我们使用 useDebounce 自定义了一个 search 函数,用于防抖搜索请求。这个函数可以直接在 Vue 组件中调用。

请实现一个vue3防抖节流指令

原文地址: https://www.cveoy.top/t/topic/bgqp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录