vue函数节流与函数防抖

概念

  • 函数节流:频繁触发,但只在特定的时间内才执行一次代码
  • 函数防抖:频繁触发,但只在特定的时间内没有触发执行条件才执行一次代码

两者的区别在于函数节流是固定时间做某一件事,比如每隔 1s 发一次请求。而函数防抖实在频繁触发后,只执行一次(两者的前提都是频繁触发)

比如在触发滑动条件下,当触及滑动条底部时需要再一次触发分页请求加载数据,如果我们用 window.onscroll 监听事件时会导致不断频繁发送相同请求消耗资源,又比如监听执行的是 Dom 操作,频繁操作会影响浏览器性能甚至会导致浏览器卡崩。这时我们就需要采用 函数节流来按一定间隔时间触发监听,规定他多少秒执行一次。

函数节流 常用于onrize,onscroll等频繁触发的函数。

//监听时间每500ms执行一次 let type = false window.onscroll = function () { if (type === true) return type = true setTimeout(() => { console.log('要执行的事') type = false }, 500) }

这里可以直接采用的定时器代码模板:

//公用定时器 , 用于函数节流,防止多次触发监听 throttle(fn, delay) { let timer = null let firstTime = true console.log('!!1') return function(...args) { if (firstTime) { // 第一次加载 fn.apply(this, args) return (firstTime = false) } if (timer) { // 定时器正在执行中,跳过 return } timer = setTimeout(() => { clearTimeout(timer) timer = null fn.apply(this, args) }, delay) } }

使用方法为

window.onscroll = this.throttle(() => { //执行函数 }, 2000) //滑动则触发事件,2000毫秒响应一次

函数防抖

函数防抖的应用场景: 输入框搜索自动补全事件,频繁操作点赞和取消点赞等等,这些场景也可以通过函数节流来实现,但是相对于函数防抖来说过于复杂
实例场景:频繁操作点赞和取消点赞,因此需要获取最后一次操作结果并发送给服务器

let timer = null; function click(){ clearTimeout(timer); timer = setTimeout(()=>{ ajax(...) },500) }

实现原理: 如果在 500ms 内频繁操作点赞或者取消点赞,则每次都会清除一次定时器然后重新创建一个,直到最后一次操作点赞或者取消点赞,然后等待 500ms 后发送 ajax

使用函数节流结合函数防抖的方法

如果想要每隔一段时间发送一次请求,而不是等到用户触发最后一次操作才发送请求,代码如下:

var startTime = null; var timer = null; function click(){ let curTime = new Date(); startTime = startTime == null?curTime:startTime; if((curTime - startTime)>1000){ // 固定上一次操作离这一次操作间隔>1000ms,则发送一次。 //这里常用于阶段性频繁操作 startTime = curTime; // 为下一次函数触发做准备 ajax(...); }else{ // 否则则执行函数防抖 clearTimeout(timer); timer = setTimeout(()=>{ ajax(xxx); },500); } }

最后

十分感谢原博主,原博客地址如下:
https://blog.csdn.net/qq_40421277/article/details/87990882


__EOF__

本文作者damarkday知识库
本文链接https://www.cnblogs.com/GoodMemoryBlog/p/14241489.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   DAmarkday  阅读(413)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示