防抖与节流

131 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

防抖(debounce)

概念

指触发事件后指定时间后才执行函数,如果在指定时间内又触发了事件,则会重新计算函数执行时间(执行最后一次函数)。

代码

<template>
<div>
<button @click="debounce">按钮1</button>
</div>
</template>

<script>
export default {
  name: 'App', 
  data() {
    return {
      flag:true,
      timeout:null
    };
  },  
  methods: {
      debounce(){     
          clearTimeout(this.timeout);    
        this.timeout = setTimeout(()=>{   
          console.log('1');
        },2000)        
      }
    }
 }   

应用场景

登录发短信按钮,避免用户多次点击发起多次请求

调整浏览器大小 resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖

文本编辑器实时保存,当无任何更改操作一秒后进行保存

联想输入法,每次输入之后都有联想词弹出,这个控制联想词的方法就不可能是输入框内容一改变就触发的,他一定
是当你结束输入一段时间之后才会触发。

节流(throttle)

概念

所谓节流,就是指连续触发事件但是在指定时间内只执行一次函数。(执行第一个函数)  

代码

<template>
<div>
<button @click="throttle">按钮2</button>
</div>
</template>

<script>
export default {
  name: 'App', 
  data() {
    return {
      flag:true,
      timeout:null
    };
  },  
  methods: {
      throttle(){
        if(!this.flag){
          return
        }   
        this.flag=false
        this.timeout = setTimeout(()=>{   
          this.flag=true 
          console.log('2');
        },2000)
      }

    },
}
</script>

使用场景:

 鼠标不断触发某事件时,如点击,只在单位事件内触发一次.
 
 浏览器播放事件,每隔一秒计算一次进度信息等
 
 懒加载时要监听计算滚动条的位置,但不必要每次滑动都触发,可以降低计算频率,而不必要浪费CPU资源.