写一个vue3 防抖函数
时间: 2023-12-26 09:58:05 浏览: 86
好的,以下是一个基于 Vue 3 的防抖函数:
```javascript
import { ref } from 'vue'
export default function useDebounce(callback, delay = 500) {
let timerId = null
const isPending = ref(false)
function debounce(...args) {
if (timerId) {
clearTimeout(timerId)
}
isPending.value = true
timerId = setTimeout(() => {
callback(...args)
isPending.value = false
}, delay)
}
return [debounce, isPending]
}
```
这个函数接收两个参数:回调函数和延迟时间(默认为 500ms)。返回值是一个数组,包含防抖函数和一个布尔值,指示当前是否有未处理的防抖事件。
使用时,你可以将该函数作为 Vue 3 组件的一个自定义 hook 使用:
```javascript
import { defineComponent } from 'vue'
import useDebounce from './useDebounce'
export default defineComponent({
setup() {
const [handleInput, isPending] = useDebounce((value) => {
console.log(value)
})
return {
handleInput,
isPending
}
}
})
```
在上面的例子中,我们使用了 `useDebounce` 自定义 hook 来创建一个防抖函数 `handleInput`。当在组件中绑定输入框的 `input` 事件时,我们可以将防抖函数作为事件处理函数,如下所示:
```html
<template>
<input type="text" @input="handleInput($event.target.value)">
<div v-if="isPending">处理中...</div>
</template>
```
这样,每次输入框的值改变时,防抖函数都会被调用。如果在延迟时间内没有更多的输入事件发生,回调函数就会被执行,否则计时器会被重置,直到下一个延迟时间。此外,我们还可以根据 `isPending` 的值来显示一个加载指示器,以提示用户当前是否有未处理的防抖事件。
阅读全文