手写防抖和节流

296 阅读1分钟

一、防抖

  • 使用场景:当input输入框需要在用户输入后实时请求,但是如果请求的时间间隔很短,会造成很多无用的请求,这时就可以用防抖来解决这个问题,即当设置为3s时,若用户输入3s无改变那么就发请求
  • 使用方式:<input @change="debounce(fn,3000)">(fn是发起请求的函数)
  • 手写思路:下面这张图是我理解比较深刻示意图,我们可以将输入比作一个进度条,当进度条达到100%时即发请求,当用户输入内容有变化的时候进度条再次从0开始计时

  • 手写代码

    function debounce(fn, delay) { let timer = null return function (){ clearTimeout(timer) timer = setTimeout(() => { fn() timer = null }, delay) }}

二、节流

  • 使用场景:如果一件事情被频繁的触发,比如浏览器滚动条的计算,频繁的计算会导致用户体验感极差,页面闪来闪去,所以我们需要在一段时间内只执行一次

  • 使用方式:window.addEventListener('scroll', debounce(fn, 1000))(fn是发起请求的函数)

  • 手写节流:我们需要在定时器没有结束的时候再次点击不理睬这次改动,那么每次在定时器结束后触发该事件就需要再次定义

  • 代码示意:

    function debounce(fn, delay) { let timer = null return function (){ clearTimeout(timer) timer = setTimeout(() => { fn() timer = null }, delay) }}