Lodash之throttle(节流)与debounce(防抖)总结

本文深入解析防抖(debounce)与节流(throttle)技术,对比二者在事件响应中的应用差异,如键盘输入与鼠标滚轮场景。通过示例说明如何使用lodash库实现防抖与节流,帮助开发者理解何时选用何种策略。

防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。

throttle API走起

_.throttle(func, [wait=0], [options={}])

func (Function): 要节流的函数。

[wait=0] (number): 需要节流的毫秒数。

[options={}] (Object): 选项对象。

[options.leading=true] (boolean): 指定调用在节流开始前,默认true。

[options.trailing=true] (boolean): 指定调用在节流结束后,默认true。

 

throttle Demo走起(Vue写法)

testThrottle: _.throttle(function() {
  console.log("throttle");
}, 5000, {
  leading: true,
  trailing: false
})

testThrottle方法被绑定在一个按钮上,demo最终的效果是 :

1、按钮点击后控制台立马打印了throttle——19:39:00;

2、5秒内点击多次按钮,最终只打印一次throttle——19:39:05前;

3、5秒后再点击一次,会重新打印throttle——19:39:05后;

PS:lodash默认trailing为true,那么最终的效果是在点击时会立即打印throttle,且5秒后又会再打印一次,即节流之前和之后都会执行该节流函数。

 

throttle 总结走起

预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新的时间周期。

简言之:结束时间点不会随点击改变

 


 

debounce API走起

_.debounce(func, [wait=0], [options={}])

func (Function): 要防抖动的函数。

[wait=0] (number): 需要延迟的毫秒数。

[options={}] (Object): 选项对象。

[options.leading=false] (boolean): 指定在延迟开始前调用,默认false。

[options.maxWait] (number): 设置 func 允许被延迟的最大值。

[options.trailing=true] (boolean): 指定在延迟结束后调用,默认true。

 

debounce Demo走起

testDebounce: _.debounce(function() {
  console.log("debounce");
}, 2000, {
  leading: true,
  trailing: false
})

 

testDebounce方法被绑定在一个按钮上,demo最终的效果是 :

1、按钮点击后控制台立马打印了debounce——19:39:00;

2、5秒内点击多次按钮,最终只打印一次debounce——19:39:05前,假设19:39:04完成了最后一次点击;

3、相对于最后一次点击的5秒后再点击一次,会重新打印debounce——19:39:09后;

PS:lodash默认leading为false、trailing为true,那么最终的效果是在点击后等待5秒才会打印debounce,即延迟之前不执行函数,而是在延迟之后执行。

 

debounce 总结走起

当调用动作触发一段时间后,才会执行该动作,若在这段时间间隔内又调用此动作则将重新计算时间间隔。

简言之:结束时间点会随点击改变

 


 

综上所述,适用情况如下:

throttle

(1)对于键盘事件,当用户键入非常频繁,但我们又必须要在一定时间(阀值)内执行处理函数的时候。例如:一些网页游戏的键盘事件。

(2)对于鼠标移动和窗口滚动,鼠标的移动和窗口的滚动会带来大量的事件,但是在一段时间内又必须看到页面的效果。例如:对于可以拖动的div,如果使用debounce,那么div会在拖动停止后突然跳到目标位置;这时就需要使用throttle。

 

debounce

(1)对于键盘事件,当用户输入比较频繁的时候,可以通过debounce合并键盘事件处理。例如:需要在用户输入完成时进行字符串校验。

(2)对于ajax请求的情况。例如:当页面下拉超过一定范围就通过ajax请求新的页面内容,这时候可以通过debounce合并ajax请求事件。

转载于:https://www.cnblogs.com/dreamsqin/p/11305028.html

### 使用 `lodash.throttle` 和 `lodash.debounce` 优化表格操作的性能 在 Vue 项目中,尤其是涉及大量数据交互或高频事件触发的场景(如表格操作),使用 `lodash.throttle` 和 `lodash.debounce` 可以有效控制函数执行频率,从而提升性能。以下是如何在表格操作中应用这两个方法的具体方式。 #### 1. 防抖debounce节流throttle)的区别 - **防抖**:在事件被触发后,等待一段时间(例如 500ms),如果在这段时间内没有再次触发,则执行一次操作。适用于输入框搜索、窗口调整等场景。 - **节流**:确保一个函数在一定时间间隔内只执行一次,无论触发多少次。适用于滚动监听、按钮点击等高频但不需要每次响应的场景[^2]。 #### 2. 在表格操作中使用 `lodash.throttle` 假设表格中有一个“刷新”按钮,频繁点击会触发多次请求,影响系统性能。可以通过 `lodash.throttle` 控制其调用频率。 ```vue <template> <vxe-button mode="text" @click="handleRefresh">刷新</vxe-button> </template> <script> import _ from 'lodash' export default { methods: { handleRefresh: _.throttle(function () { console.log('执行刷新操作') }, 1000) } } </script> ``` 上述代码中,`handleRefresh` 方法被限制为每 1000 毫秒最多执行一次,即使用户连续点击也不会重复触发,从而避免了不必要的资源消耗[^4]。 #### 3. 在表格操作中使用 `lodash.debounce` 如果表格中包含一个搜索功能,用户在输入时频繁触发查询请求,可以使用 `lodash.debounce` 来减少请求次数。 ```vue <template> <input v-model="searchText" placeholder="请输入关键词" @input="handleSearch" /> </template> <script> import _ from 'lodash' export default { data() { return { searchText: '' } }, methods: { handleSearch: _.debounce(function () { console.log(`搜索内容: ${this.searchText}`) }, 500) } } </script> ``` 在此示例中,只有当用户停止输入 500 毫秒后才会执行搜索逻辑,减少了无效请求的次数,提升了用户体验和性能[^2]。 #### 4. 在表格行操作中结合 throttledebounce 对于每一行中的“编辑”和“删除”按钮,通常不需要进行防抖节流处理,因为它们是低频操作。但如果这些操作涉及复杂计算或频繁状态更新,也可以考虑加入节流机制。 ```vue <template #default="{ row }"> <vxe-button mode="text" @click="handleEdit(row)">编辑</vxe-button> <vxe-button mode="text" @click="handleDelete(row)">删除</vxe-button> </template> <script> import _ from 'lodash' export default { methods: { handleEdit: _.throttle(function (row) { console.log('编辑行:', row) }, 1000), handleDelete: _.throttle(function (row) { console.log('删除行:', row) }, 1000) } } </script> ``` 这种方式适用于防止用户快速连续点击导致的重复操作,尤其是在网络请求或状态变更频繁的情况下[^4]。 #### 5. 安装引入 lodash 在项目中使用 `lodash` 的节流防抖功能前,需要先安装: ```bash npm install --save lodash ``` 然后可以在组件中引入整个库或仅引入所需模块: ```javascript // 引入整个 lodash import _ from 'lodash' // 或者仅引入 throttledebounce import throttle from 'lodash/throttle' import debounce from 'lodash/debounce' ``` 这样可以避免引入不必要的代码,提高构建效率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值