//1.utils 文件封装方法
export const debounce =function(fn,t){
let timer
return function(){
let context =this
let agms = arguments
if(timer){
clearTimeout(timer)
}
timer =setTimeout(function(){
fn.apply(context,agms)
},t)
}
}
理解:1.防抖间隔时间内只执行最后一次;场景:LOL-Games中的-回城
1.1:先声明一个存储定时器的开关,
1.2:判断timer中是否有执行的setTimeout,如果有清除定时器;没有则给timer赋值一个定时器;定时器中写入我们需要执行的fn函数
1.3:fn函数修改this指向,由于fn是传过来的一个函数,需要注意的是fn函数在Vue中并没有声明,只是实参传形参的一个函数,所以调用后this指向应该是windos,但实际打印出来为undefined,原因
Vue:源码:
function initMethods (vm: Component) {
const methods = vm.$options.methods
if (methods) {
for (const key in methods) {
//这一行是重点
vm[key] = methods[key] == null ? noop : bind(methods[key], vm)
if (process.env.NODE_ENV !== 'production' && methods[key] == null) {
//...这一段是容错信息 不用管
}
}
}
所以需要修改fn的this指向;debounce函数的this指向为Vue;是由methods中的函数进行调用所以会指向vue
注意:在methods中使用debounce函数的时候需要解析
例如:
<el-button @click="requestSubmit"></elbutton>
methods:{
requestSubmit:debounce(function(){
this.AXAJ()
},1000)
}
vue2项目中使用防抖或节流时封装的utils
最新推荐文章于 2024-07-25 10:54:43 发布