一文搞懂如何在 React 中使用 防抖(Debounce)和 节流(Throttle)

这篇具有很好参考价值的文章主要介绍了一文搞懂如何在 React 中使用 防抖(Debounce)和 节流(Throttle)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在前端的日常开发中,经常会使用到两个函数防抖(Debounce)和节流(Throttle),防抖函数可以有效控制在一段时间内只执行最后一次请求,例如搜索框输入时,只在输入完成后才进行请求接口。而节流函数则是每隔一段时间就执行一次请求。

在 React 应用开发时,不同于普通的 js,而且通过 react hook 机制,可以更方便的实现这两个功能。

防抖函数(Debounce)

react throttle,react.js,前端,javascript

从上面的图中可以看出,使用了防抖函数后,无论我们中间点了多少次,也只会在延时结束时执行一次。

使用 js 简单实现防抖函数

function debounce(fn: any, wait: number) {let timer: anyreturn (...args: any) => {// @ts-ignoreconst context = thisif (timer) clearTimeout(timer)timer = setTimeout(() => {timer = nullfn.apply(context,args)}, wait)}
} 

防抖的原理比较简单,就是使用闭包保存住计时器 timer 和 传递的函数,然后每次进入时都把之前的 timer 清空掉,这样延时 wait 每次都会从新开始计算,以此来达到只在延时结束后执行一次的效果。

在 React Input 中使用防抖函数

假设有个需求,用户通过输入商品名来搜索商品,那么不可能每次用户输入时都去请求后台接口,最好的处理方式就是加上防抖功能,只在用户输入完成后请求一次,这样做可以避免多次无效的调用后台接口。

实现这个功能用传统的方法可以这样做:

// 防抖函数,间隔时间为 2 秒
const changeDebounce = useCallback(debounce(handleChange, 2000), [])

// 搜索框,非受控组件
<Input onChange={(e) => changeDebounce(e)} style={{width: 150, marginRight: 20}}/> 

可以看出上面的方式比较适合非受控的组件,如果是受控组件,可以采用 React Hooks 机制来实现:

// 传递给 Input 组件的值
const [value, setValue] = useState('')

// useEffect 钩子函数
useEffect(() => {const getData = setTimeout(() => {if (!value) returninfo('异步请求....')}, 2000)return () => clearTimeout(getData)
}, [value])

// 搜索框,受控组件
<Input value={value} onChange={(e) => setValue(e.target.value)} style={{width: 150, marginRight: 20}}/> 

可以看出,使用 useEffect 钩子函数可以很方便的实现防抖功能,原因就在于依赖了 value 值的变化,每次 value 变化后 useEffect 钩子都会执行清除逻辑,也就是 return 返回的函数,重新执行,这样就保证了多次输入内容后,只有到了间隔时间才会执行一次的逻辑。

如果再抽象一点,我们可以把这段逻辑提取成一个自定义 hook:

const useDebounce = <V>(value: V, wait: number) => {const [debounceValue,setDebounceValue] = useState(value)useEffect(() => {const timer = setTimeout(() => setDebounceValue(value),wait)return () => clearTimeout(timer)},[value,wait])return debounceValue
} 

在自定义 hook 中,使用了另外一个 state 进行保存和更新状态,只有在间隔时间到了才会更新,然后将这个新的 state 返回出去,在页面上可以这样使用,直接依赖 返回出来的状态,这样每次这个状态改变时,就是间隔时间到了的时候,就可以进行异步请求了。

const debounceValue = useDebounce(value,2000)

useEffect(() => {if (!debounceValue) returninfo('异步请求....')
},[debounceValue]) 

最终的效果如下:

react throttle,react.js,前端,javascript

节流函数(Throttle)

react throttle,react.js,前端,javascript

上面的图比较好看出来节流函数的应用场景,一般是在滚动屏幕等执行次数很密集的情况下使用,有点限流的意思。

使用 js 实现节流函数

function throttle(fn: any, wait: number) {let inThrottle = falsereturn (...args: any) => {// @ts-ignoreconst context = thisif (!inThrottle) {inThrottle = truefn.apply(context, args)setTimeout(() => {inThrottle = false}, wait)}}
} 

节流函数实现的方式就是通过变量来控制是否执行逻辑,这里使用了 inThrottle 这个 boolean 值来进行控制,如果时间没到就一直是 true 的状态,直到时间到了后开始执行逻辑。

下面通过个小例子演示一下没有使用节流函数时,拖动效果:

<div style={{width: 50, height: 50, backgroundColor: 'blue'}} draggable={true} onDrag={() => { info('被拖动了~~~') }}
/> 
react throttle,react.js,前端,javascript

可以看到,在不试用节流函数的情况下,刚一拖动,就执行了许多许多次,如果这是请求,肯定是能把接口都刷爆的,所以这种情况一定要使用节流函数来控制一下频率,下面是使用了节流函数的效果:

const changeThrottle = useCallback(throttle(() => {info('异步请求....')
}, 2000), [])

<div style={{width: 50, height: 50, backgroundColor: 'blue'}} draggable={true}onDrag={changeThrottle}
/> 
react throttle,react.js,前端,javascript

加了节流函数后,无论怎样快速拖动,执行的逻辑也是按照间隔时间的频率进行执行的。

在 React 中使用节流函数

我们可以像上面的防抖函数一样,将节流函数也使用 React Hook 来实现:

const useThrottle = <V>(value: V, wait: number) =>{const [throttledValue, setThrottledValue] = useState<V>(value)const lastExecuted = useRef<number>(Date.now())useEffect(() => {if (Date.now() >= lastExecuted.current + wait) {lastExecuted.current = Date.now()setThrottledValue(value)} else {const timerId = setTimeout(() => {lastExecuted.current = Date.now()setThrottledValue(value)}, wait)return () => clearTimeout(timerId)}}, [value, wait])return throttledValue
} 

这里主要通过时间对比来控制是否更新 throttledValue,以达到节流的效果,在组件中可以这样使用:

const [value, setValue] = useState(0)
const throttledValue = useThrottle(value, 2000)

useEffect(() => {if (value === 0) returninfo('throttle 异步请求....')
}, [throttledValue])

const handleDrag = () => {setValue(prevState => prevState + 1)
}

<div style={{width: 50, height: 50, backgroundColor: 'blue'}} draggable={true} onDrag={handleDrag}
/> 

最终的效果和直接使用 throttle 函数是一样的。

总结

在前端开发中,防抖和节流函数几乎是必备的技能,它们的实现原理都离不开 js 闭包的特性,而在 React 中通过使用自定义的 hook,可以达到一样的效果,有些场景下可能还更方便些,但总的来说本质还是那样。文章来源地址https://www.toymoban.com/news/detail-705718.html

react throttle,react.js,前端,javascript ## 最后 整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。 react throttle,react.js,前端,javascript react throttle,react.js,前端,javascript react throttle,react.js,前端,javascript react throttle,react.js,前端,javascript > **有需要的小伙伴,可以点击下方卡片领取,无偿分享**

到了这里,关于一文搞懂如何在 React 中使用 防抖(Debounce)和 节流(Throttle)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序如何使用防抖和节流?

    防抖(Debounce)和节流(Throttle)都是用来优化函数执行频率的技术,特别在处理用户输入、滚动等频繁触发的情况下,它们可以有效减少函数的执行次数,从而提升性能和用户体验。但它们的工作方式和应用场景有所不同。 防抖的主要思想是,当持续触发事件时,在事件最

    2024年02月13日
    浏览(26)
  • vue2使用lodash中的防抖(debounce)函数

    在Vue中使用防抖函数可以避免在频繁触发的事件中重复执行操作,例如搜索框输入时的实时搜索。下面是一个使用防抖函数的示例: 安装防抖函数库 首先,你需要安装一个防抖函数库,例如lodash库的 debounce 函数。你可以使用npm或yarn命令来安装它: 或 在Vue组件中引入并使用

    2024年02月13日
    浏览(32)
  • [绍棠] vue中使用lodash的debounce(防抖函数)

    1、安装 2、引入 3、使用 这两种使用方式效果一样  ------------分割线------------- 观察者防抖: 事件处理器防抖: 为什么不在method中写好方法,在template中直接调用,就像这样 组件使用 export default { ... } 导出的 options 对象,包括方法,会被组件实例重用。 如果网页中有 2 个以

    2024年02月12日
    浏览(31)
  • 手写一个防抖节流函数及其使用场景

      防抖和节流是性能优化手段 什么是防抖? 防抖:单位时间内,频繁触发事件,只执行最后一次。 防抖的主要应用场景: 搜索框搜索输入。只需用户最后一次输入完,再发送请求 手机号、邮箱验证输入检测 什么是节流? 节流:单位时间内,频繁触发事件,只执行一次。

    2024年02月09日
    浏览(30)
  • Vue - 使用Lodash实现防抖和节流

    GitHub Demo 地址 在线预览 Lodash 官网 更新:对应的vue3版的demo如下: GitHub Demo 地址 在线预览 参考: Vue 防抖节流 详细介绍 vue 优雅的实现防抖和节流 防抖、节流的介绍 js防抖和节流的实现原理及应用场景 js防抖节流应用场景及写法 JS中的防抖 函数节流(throttle)与 函数防抖(

    2024年02月01日
    浏览(32)
  • 【js】防抖和节流的使用场景和区别:

    一、防抖 (多次触发 只执行最后一次) 作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间 防抖类似于英雄联盟回城6秒,如果回城中被打断,再次回城需要再等6秒 二、节流 (规定时间内 只触发一次) 作用:

    2024年02月10日
    浏览(25)
  • vue项目使用lodash节流防抖函数问题与解决

    在lodash函数工具库中,防抖 _.debounce 和节流 _.throttle 函数在一些频繁触发的事件中比较常用。 创建一个 debounced(防抖动)函数,该函数会从上一次被调用后,延迟  wait  毫秒后调用  func  方法。 参数 func   (Function) : 要防抖动的函数。 [wait=0]   (number) : 需要延迟的毫秒数。

    2024年02月08日
    浏览(30)
  • vue防抖 指令 v-debounce

    2024年02月16日
    浏览(29)
  • Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

    各位朋友你们好呀。今天是立春,明天就是正月十五元宵节了,这种立春 + 元宵相隔的时候,可是很难遇到的,百年中就只有几次。在这提前祝大家元宵快乐。 今天给大家带来的是 Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 这篇文章,文章中不仅会讲述原来使用的防

    2024年02月01日
    浏览(29)
  • 一文搞懂如何在VS中使用OpenCV

    下载OpenCV并在VS2019上进行配置 1.进入OpenCV官网选择想要的版本进行下载 ​ https://opencv.org/releases/ ​ 点击对应的应用场景即可开始下载 2.下载完成后运行exe ​ 选择下载路径,然后等待下载即可 3.配置环境变量 ​ 打开下载好的OpenCV文件所在位置,将F:developopencvopencvbuildx6

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包