react hooks实现防抖节流的方法小结
下面均拿一个input框的onChange事件为例。
防抖
1.当持续触发事件时,一定时间段内没有再触发事件,事件处理函数会执行一次。
2.如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
代码:
方法一:
import React from "react"; function ThrotShak() { let shak; const service = (data) => { console.log('向服务端发送数据', data); } const handleChange = (e) => { if (shak) { clearTimeout(shak) } shak = setTimeout(() => { service(e.target.event); }, 3000) } return ( <div style={{ flex: 1, border: '1px solid blue', padding: '3px' }}> <div>防抖:多次触发执行最后一次</div> <input onChange={handleChange} /> </div> ) } export default ThrotShak;
方法二:
import React from 'react'; import { debounce } from 'lodash'; function ThrotShak(){ const service = (data) => { console.log('向服务端发送数据', data); } const handleChange = () => debounce(service, 500); return ( <input type="text" onChange={handleChange} /> ); }; export default ThrotShak;
节流
当持续触发事件时,保证一定时间段内只调用一次事件处理函数。
代码:
方法一:
import React from "react"; function ThrotShak() { const service = (data) => { console.log('向服务端发送数据', data, new Date()); } let throt; function handleChange() { if (throt) { return ; } throt = setTimeout(() => { service(); throt = null; }, 3000) } return ( <div style={{ flex: 1, border: '1px solid blue', padding: '3px' }}> <div>节流: 持续触发事件时,每过n钟执行一次</div> <input onChange={handleChange} /> </div> ) } export default ThrotShak;
方法二:
import React from 'react'; import { throttle } from 'lodash'; function ThrotShak(){ const service = (data) => { console.log('向服务端发送数据', data); } const handleChange = () => throttle(service, 500); return ( <input type="text" onChange={handleChange} /> ); }; export default ThrotShak;
拓展:
除上面两种实现方法外,还可用用useEffect实现。无论哪种实现方式,大家要以自己的应用场景为准,还要考虑一下性能问题。本身选择防抖或者节流就是要提高性能(减少频繁触发事件,降低不必要的计算,渲染和服务器请求),节约资源(减少浪费服务器资源和带宽),提高用户体验(防止用户误触或者频繁点击)。
实现过程中大家要注意clearTimeout和把赋值参数置为null的区别:clearTimeout是指把定时器清楚掉,并不会把定时器的id置为null,一般用于定时器挂载并未执行时;把赋值参数置为null是要清除缓存,这里不懂得话,可以看一下闭包和浏览器垃圾回收机制得原理。在组件卸载时把定时器清除掉和id置为null一起调用比较好。
心得:
一题多解还是有必要得,既拓宽了自己得思路,又增加了解题技巧,当然,解题还是会受场景和代码框架约束得。
到此这篇关于react hooks实现防抖节流的方法小结的文章就介绍到这了,更多相关react hooks防抖节流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
关于React16.0的componentDidCatch方法解读
这篇文章主要介绍了关于React16.0的componentDidCatch方法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05react-native 封装选择弹出框示例(试用ios&android)
本篇文章主要介绍了react-native 封装选择弹出框示例(试用ios&android),具有一定的参考价值,有兴趣的可以了解一下2017-07-07
最新评论