vue以组件或者插件的形式实现throttle或者debounce
需求
在业务中,会碰到许多点击请求的情况,在请求前改变一个lock变量(在lock变回来之前,点击无效),在请求回调中再改变lock.以确保在,请求回来之前,不会重复请求。或者类似的点击节流业务
实现方式
指令
指令
组件
子组件
importVuefrom'vue'; import{Component,Prop}from'vue-property-decorator'; @Component({}) exportdefaultclassChildextendsVue{ @Prop({type:Number,default:500})publictimeOut!:number;//时间 @Prop({type:String,default:'throttle'})publictype!:string;//类型 @Prop()publicparams!:any;//传入参数 publicmessage:string='Hello'; publicthrottleLock:boolean=false; publicdebounceLock:number=0; publictime:any; publicsenClick():void{ console.log(this.timeOut,this.type,this.params); if(this.type==='throttle'){ if(this.throttleLock){ return; } this.throttleLock=true; setTimeout(()=>{ this.throttleLock=false; },this.timeOut); this.$emit('myClick',this.params); }elseif(this.type==='debounce'){ if(this.debounceLock){ clearTimeout(this.debounceLock); } this.debounceLock=setTimeout(()=>{ this.$emit('myClick',this.params); },this.timeOut); }else{ this.$emit('myClick',this.params); } } } div{ width:100%; height:100%; }
父组件
我是组件内容
plugin
函数
functiondeb(fn:function){ letlock:number return(e)=>{ if(lock){ clearTimeout(lock) } console.log('创建闭包延迟执行') lock=setTimeout(()=>{ fn(e) },1500) } } export{deb}
组件内使用
function