函数防抖和函数节流原理理解
防抖和节流有什么用,一般的使用场景,原理是什么
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
函数防抖和函数节流原理理解相关推荐
- 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用
函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 文章目录 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 1. 为什么要防抖节流 1.1 ...
- 函数防抖 和 函数节流
函数防抖 和 函数节流 函数防抖(debounce) 概念 函数防抖 就是指 触发事件后 在 n 秒内 函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间. 简单的说,当一个动作 ...
- js中的函数防抖和函数节流
1.什么是函数防抖和函数节流 防抖(debounce)和节流(throttle)都是用来控制某个函数在一定时间内执行多少次的技巧,两者相似不相同,基本思想都是某些代码不可以在没有间断的情况下连续重复执 ...
- 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析
函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.比如scroll resize等事件,这些事件在某些场景触发非常频繁. 比如,实现一个原生的拖拽功能(不能用 H5 Drag& ...
- 函数防抖和函数节流的最简单解释
函数防抖:连续触发的事件,只会触发最后一次.每次触发的时候都会清除上一次待触发的. const debounce = (func, wait) => {let timer;return (par ...
- 函数防抖debounce和节流throttle
debounce 函数防抖 1.什么是函数防抖 函数防抖是优化高频率执行 js 代码的一种手段 可以让被调用的函数在一次连续的高频率操作过程中只被调用一次 2.函数防抖的作用 减少代码执行次数,提升网 ...
- 微信小程序 函数防抖和函数节流
函数防抖:延迟函数执行,多用于input框输入时,显示匹配的输入内容的情况 函数节流:单位时间n秒内,第一次触发函数执行 之后不管触发多少次都不执行.到下一个单位时间n秒时 第一次触发函数执行,多用于 ...
- SAP UI5和Angular的函数防抖(Debounce)和函数节流(Throttle)实现原理介绍
这是Jerry 2021年的第 11 篇文章,也是汪子熙公众号总共第 282 篇原创文章. Jerry之前的文章 SAP UI5 OData谣言粉碎机:极短时间内发送两个Odata request, ...
- “约见”面试官系列之常见面试题第二十一篇之函数防抖和节流(建议收藏)
目录 前言 概念 函数防抖(debounce) 函数节流(throttle) 常见应用场景 函数防抖的应用场景 函数节流的应用场景 实现原理 函数防抖(debounce) 函数节流(throttle) ...
最新文章
- 2021-2027年中国一体化预制泵站行业研究及前瞻分析报告
- FastReport.net 使用 Winform WebForm打印
- 18种方法让你集中精力工作
- visual studio 2015开发nodejs教程1搭建环境
- thymeleaf 的 th:onclick js方法入参
- 配置keepalived+LVS_DR
- 回溯专题leetcode
- 双纵坐标的绘图命令_Matplotlib绘图 | 快速定义图表样式的小技巧
- 【论文写作】网上选课系统中数据库设计模块如何写
- c#类的方法表的建立和方法的调用
- android随机小球碰撞(一)边界检测
- [转帖]团队管理 - 盖洛普Q12测评法
- C/C++编程笔记:C++中的atol(),atoll()和atof()函数
- html根据出生日期计算星座,星座测算.html
- 关于PTC保险丝工作原理总结
- 2年前我从华为外包辞职,如今干到创业公司倒闭,36岁的我该何去何从?
- Windows2016 L2TP配置(证书模式)
- Improved autoencoder for unsupervised anomaly detection
- qcqa是什么职位_QA和QC是什么意思?区别是什么?
- 百度地图SDK无法定位到当前所在位置;一直显示天安门