前言:关于防抖节流,去网上搜到的很多基本上都是JS的写法,通过一个闭包对一个变量进行控制,而JS相对来说少一点,到了Vue3 + Ts这里的项目基本舍弃了this这种逗乐的东西,所以搜到的写法很多都不管用的。
- 在Vue中可以使用闭包的方法实现防抖节流。
- 同样也可以用lodash函数库中的_.throttle() / _.debounce()实现节流防抖
- 亦或是使用Vue中的directive()自定义指令,这样做的好处可以随处使用(建议)
自定义指令v-throttle
- 首先在src目录下新建一个throttle的文件夹
- 新建index.ts文件
- 写入下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import type { App, Directive } from "vue";
export default function setupThrottleDriective(app : App) { let timer : any = null
function throttleELfun(el : HTMLElement, throttleTime = 5000) { el.addEventListener('click', (event:Event) => { if (!timer) { timer = window.setTimeout(() => { timer = null }, throttleTime) } else { event?.stopImmediatePropagation() } }, true) }
const throttleDirective : Directive<HTMLElement> = { beforeMount(el, bingding) { throttleELfun(el, bingding.value) }, }
app.directive('throttle', throttleDirective) }
|
全局导入指令
- 打开项目中的main.ts文件
- 引入函数setupThrottleDriective()
- 传入参数
1 2 3 4 5 6 7 8 9
| import { createApp } from 'vue' import App from './App.vue' import setupThrottleDriective from './throttle'
import './assets/base.css' const app = createApp(App)
setupThrottleDriective(app) app.mount('#app')
|
然后即可直接在组件中使用了,使用之后会对该HTML元素进行监听,在一定的时间间隔里面多次执行,只会执行一次