防抖和节流有什么用,一般的使用场景,原理是什么

1.作用

使用函数节流与函数防抖的目的,就是为了节约计算机资源,提升用户体验。

2.场景

  • 节流一般是用在必须执行这个动作,但是不能够执行太频繁的情况下,例如滚动条滚动时函数的处理,可以通过节流适当减少响应次数;

  • 防抖一般是用来,用户输入有操作时,暂时不执行动作,等待没有新操作时,进行相应响应,例如用户名输入校验的情况,可以等待用户输入完成后再发送请求去校验。

3.原理

总的来说,函数节流与函数防抖的原理非常简单,巧妙地使用 setTimeout 来存放待执行的函数,这样可以很方便的利用 clearTimeout 在合适的时机来清除待执行的函数。

  • 函数节流: 指定时间间隔内只会执行一次任务;
  • 函数防抖: 任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。

节流:等待lock的状态,如果lock状态为false,则不会再次执行语句if (!lock) return;后面的内容,直至等待setTimeout函数内容执行完毕,将lock置为true之后,才会再次执行,从而达到减少fn响应次数。

function throttle(fn, interval = 300) {let lock = true;return function () {if (!lock) return;lock = false;setTimeout(() => {fn.apply(this, arguments);lock = true;}, interval);};
}

防抖:interval时间内,如果有fn再次触发,则会清除上次的函数执行,重新设置新的延迟函数,如果超过interval事件间隔,则会执行传入的fn函数。

function debounce(fn, interval = 300) {let timeout = null;return function () {if (timeout) {clearTimeout(timeout);}timeout = setTimeout(() => {fn.apply(this, arguments);}, interval);};
}

4.React Hooks中使用

在hooks中使用时,通常会是如下的用法:

export default function() {const [counter, setCounter] = useState(0);const handleClick = useDebounce(function() {setCounter(counter + 1)}, 1000)return <div style={{ padding: 30 }}><ButtononClick={handleClick}>click</Button><div>{counter}</div></div>
}

实现时,我们需要使用到hooks中的useRef进行缓存timer,通过useRef保留fn方法与timer,实现代码:

function useDebounce(fn, delay, dep = []) {const { current } = useRef({ fn, timer: null });useEffect(function () {current.fn = fn;}, [fn]);return useCallback(function f(...args) {if (current.timer) {clearTimeout(current.timer);}current.timer = setTimeout(() => {current.fn.call(this, ...args);}, delay);}, dep)
}

同理我们直接给出useThrottle的代码:

function useThrottle(fn, delay, dep = []) {const { current } = useRef({ fn, timer: null });useEffect(function () {current.fn = fn;}, [fn]);return useCallback(function f(...args) {if (!current.timer) {current.timer = setTimeout(() => {delete current.timer;}, delay);current.fn.call(this, ...args);}}, dep);
}

参考:
1.https://juejin.im/entry/58c0379e44d9040068dc952f
2.https://juejin.im/post/5ea04691e51d4547126400c7?utm_source=gold_browser_extension

函数防抖和函数节流原理理解相关推荐

  1. 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用

    函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 文章目录 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 1. 为什么要防抖节流 1.1 ...

  2. 函数防抖 和 函数节流

    函数防抖 和 函数节流 函数防抖(debounce) 概念 函数防抖 就是指 触发事件后 在 n 秒内 函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间. 简单的说,当一个动作 ...

  3. js中的函数防抖和函数节流

    1.什么是函数防抖和函数节流 防抖(debounce)和节流(throttle)都是用来控制某个函数在一定时间内执行多少次的技巧,两者相似不相同,基本思想都是某些代码不可以在没有间断的情况下连续重复执 ...

  4. 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析

    函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.比如scroll resize等事件,这些事件在某些场景触发非常频繁. 比如,实现一个原生的拖拽功能(不能用 H5 Drag& ...

  5. 函数防抖和函数节流的最简单解释

    函数防抖:连续触发的事件,只会触发最后一次.每次触发的时候都会清除上一次待触发的. const debounce = (func, wait) => {let timer;return (par ...

  6. 函数防抖debounce和节流throttle

    debounce 函数防抖 1.什么是函数防抖 函数防抖是优化高频率执行 js 代码的一种手段 可以让被调用的函数在一次连续的高频率操作过程中只被调用一次 2.函数防抖的作用 减少代码执行次数,提升网 ...

  7. 微信小程序 函数防抖和函数节流

    函数防抖:延迟函数执行,多用于input框输入时,显示匹配的输入内容的情况 函数节流:单位时间n秒内,第一次触发函数执行 之后不管触发多少次都不执行.到下一个单位时间n秒时 第一次触发函数执行,多用于 ...

  8. SAP UI5和Angular的函数防抖(Debounce)和函数节流(Throttle)实现原理介绍

    这是Jerry 2021年的第 11 篇文章,也是汪子熙公众号总共第 282 篇原创文章. Jerry之前的文章 SAP UI5 OData谣言粉碎机:极短时间内发送两个Odata request, ...

  9. “约见”面试官系列之常见面试题第二十一篇之函数防抖和节流(建议收藏)

    目录 前言 概念 函数防抖(debounce) 函数节流(throttle) 常见应用场景 函数防抖的应用场景 函数节流的应用场景 实现原理 函数防抖(debounce) 函数节流(throttle) ...

最新文章

  1. 2021-2027年中国一体化预制泵站行业研究及前瞻分析报告
  2. FastReport.net 使用 Winform WebForm打印
  3. 18种方法让你集中精力工作
  4. visual studio 2015开发nodejs教程1搭建环境
  5. thymeleaf 的 th:onclick js方法入参
  6. 配置keepalived+LVS_DR
  7. 回溯专题leetcode
  8. 双纵坐标的绘图命令_Matplotlib绘图 | 快速定义图表样式的小技巧
  9. 【论文写作】网上选课系统中数据库设计模块如何写
  10. c#类的方法表的建立和方法的调用
  11. android随机小球碰撞(一)边界检测
  12. [转帖]团队管理 - 盖洛普Q12测评法
  13. C/C++编程笔记:C++中的atol(),atoll()和atof()函数
  14. html根据出生日期计算星座,星座测算.html
  15. 关于PTC保险丝工作原理总结
  16. 2年前我从华为外包辞职,如今干到创业公司倒闭,36岁的我该何去何从?
  17. Windows2016 L2TP配置(证书模式)
  18. Improved autoencoder for unsupervised anomaly detection
  19. qcqa是什么职位_QA和QC是什么意思?区别是什么?
  20. 百度地图SDK无法定位到当前所在位置;一直显示天安门

热门文章

  1. autojs某音霓虹特效
  2. oCPC实践录 | 随你千变万化,oCPC PID控制(3)
  3. R语言中的抽样方法与描述统计函数
  4. iphone6 分辨率与适配
  5. 如何写一个bat批处理自动上传文件到FTP 转载
  6. 西邮linux小组面试题总结(2016-5-30)
  7. DISC职场人格与高效沟通技巧--王伟老师
  8. 关于QT TTS ( TextToSpeech ) 编码导致的只能读英文不能读中文的问题
  9. 笔记本内存不够用怎么扩大
  10. python3安装ibm_db