✨性能优化之防抖节流篇

简介: ✨性能优化之防抖节流篇

前言


防抖节流作为前端面试经典手撕代码题,掌握防抖和节流是一个前端开发人员工程能力的体现,不会封装防抖和节流?一起来学习吧~🙆‍♂️


防抖(debounce)


基本概念


在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。


举个🌰子


我们在搜索框输入关键词进行搜索时,就会发送ajax请求,然后展示在列表,这是一个很常见的场景,接下来我们来模拟一下:


<span>防抖案例</span>
  <input type="text">
复制代码


const input = document.querySelector('input')
    input.addEventListener('keyup',function(){
    // 模拟ajax请求
      console.log(input.value);
    })
复制代码


cac8c32bb78e41b2aedb3e37c0ed40f6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


我们会发现每次只要按下键盘都会发送ajax请求,然而这是非常浪费资源的,我们应该在用户输入完字符后一段时间再发送ajax请求,我们来优化一下~


const input = document.querySelector('input')
    let timer = null
    input.addEventListener('keyup',function(){
      if(timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(()=>{
        // 模拟ajax请求
        console.log(input.value);
        // 清空定时器
        timer = null
      },500)
    })
复制代码


2ba2332e4c7b427ab416da3ef011460a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif



我们通过演示可以发现,当你在频繁的输入时,并不会发送请求,只有当你在500ms内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。这样我们的防抖功能就实现啦~


防抖就好像是英雄释放技能时的读条,技能读条没读完再次使用该技能就会重新读条。


封装防抖函数


上面我们只对该输入框做了防抖,如果有多个输入框需要做防抖,我们不应该把这个防抖功能再实现一次,应该封装一个防抖函数,该使用防抖的时候调用它即可,我们来尝试吧~


// 封装防抖函数
    function debounce(fn,delay = 500){
      let timer = null
      return function(){
        if(timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(()=>{
          fn.apply(this,arguments)
          timer = null
        },delay)
      }
    }
    // 使用
    input.addEventListener('keyup',debounce(function() {
      console.log(input.value);
    },500))
复制代码


节流(throttle)


基本概念


规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。


举个🌰子


拖拽一个元素时,要随时拿到该元素被拖拽的位置,如果没有节流,只要该元素移动1丢丢,哪怕是1px,都会获取当前拖拽的位置,这是非常消耗性能的,容易造成卡顿。


a0329740f3844b6b89edaac4fc7f264c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


那我们就来优化一下,使用节流,每500ms获取当前元素的位置,来看代码:


const div1 = document.querySelector('div')
    let timer = null
    div1.addEventListener('drag',function(e){
      if(timer) {
        return
      }
      timer = setTimeout(()=>{
        console.log(e.offsetX,e.offsetY);
        timer = null
      },500)
    })
复制代码


这样我们的节流操作就做好啦,来看效果~


403d2a7c8eca44dab734fcbcd9d8601c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


节流就好像是你在玩吃鸡时,即使你猛戳开火键,子弹也只会以预定的速度射出,这么样是不是很好理解。


封装节流函数


// 封装节流
    function throttle(fn,delay = 500) {
      let timer = null
      return function() {
        if(timer) {
          return
        }
        timer = setTimeout(()=>{
          fn.apply(this,arguments)
          timer = null
        },delay)
      }
    }
    // 使用
    div1.addEventListener('drag',throttle(function(e){
      console.log(e.offsetX,e.offsetY);
    },500))
复制代码


最后


⚽本文介绍了性能优化中的防抖节流的概念以及如何使用~

⚾如果这篇文章对你有帮助的话,麻烦点赞收藏哟~

相关文章
|
安全 网络协议 网络安全
网站被攻击了该怎么办?如何恢复网站,如何避免网站被攻击?
网站被攻击了该怎么办?如何恢复网站,如何避免网站被攻击?
|
JSON 运维 JavaScript
进程管理工具PM2在python项目中的使用
说到进程管理,后端和运维的同学都不陌生。生产项目以及一些脚本任务都需要进行进程管理。现在市场上用得最多的当属supervisor了,但是它只能运行在 Unix-Like 的系统上,也就是说supervisor不能再windows上运行。 我们这里说的是另外一个进程管理工具PM2,PM2不仅仅适用于Unix-Like系统,同样适用于windows系统。这点对于开发者来说也是个福音,下面我们来说说PM2的简单使用。
2076 0
进程管理工具PM2在python项目中的使用
|
前端开发 Python
ElementUI上传组件el-upload自定义http-request上传到Flask服务
ElementUI上传组件el-upload自定义http-request上传到Flask服务
1132 0
ElementUI上传组件el-upload自定义http-request上传到Flask服务
|
数据采集 机器学习/深度学习 算法
数据治理之参考数据与主数据管理
最近凑巧参与了一次某行业的业务共创会议,期间讨论到了主数据系统,还有我们该如何参与主数据系统建设的话题。说实话,我一直以为我不会有机会参与到主数据与参考数据系统的话题中去,所以,又去把DAMA的书籍翻了翻。顺便也重新思考了一下主数据与参考数据这个数据治理的课题。
3631 1
数据治理之参考数据与主数据管理
|
传感器 存储 人工智能
STM32第一章-寄存器你懂吗?
嵌入式系统是小型计算机的一个分支系统。平常用的PC,就属于功能比较专一的计算机,从核心的处理器来说,可以分成嵌入式微处理器和嵌入式微控制器,我们传统意义上的那种单片机,比如说像51、AVR还有按里面比较低配的一些,比如说像Cortex-M系列的这一类,我们都把它划分为微控制器,微处理器呢,就相对来说处理能力,运算能力要强一些,比如ARM9以上的系列和 Cortex-A以及以上系列。STM32属于一个微控制器,请大家牢牢记住微控制器这四个字。STM32自带了各种常用通信接口,比如USART、I2C、SPI等,可接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品都有STM3
1430 0
 STM32第一章-寄存器你懂吗?
|
JSON 搜索推荐 C++
vscode如何更改背景颜色主题,黑色或白色?
【11月更文挑战第16天】在 VS Code 中更改背景颜色主题,可通过三种方式实现:1) 使用快捷键 Ctrl+K 和 Ctrl+T(Mac 上为 Command+K 和 Command+T)选择主题;2) 通过菜单中的“管理”-&gt;“颜色主题”选项选择;3) 修改 settings.json 文件中的 &quot;workbench.colorTheme&quot; 属性。此外,用户还可从扩展市场安装更多主题以满足个性化需求。
35946 6
|
存储 数据管理 Linux
Linux 存储管理 (一)存储方式
【8月更文挑战第13天】在Linux中,存储管理方式多样,包括文件系统如Ext4、XFS,支持高效数据管理;磁盘分区实现数据隔离;逻辑卷管理(LVM)提供灵活的存储池;网络文件系统(NFS)及网络附加存储(NAS)实现远程文件共享;存储区域网络(SAN)提供高性能块级访问;RAID技术增强数据冗余与读写速度。分区类型含主分区、扩展分区、逻辑分区及引导分区,利用`lsblk`可查看磁盘信息,而`fdisk`则用于创建与管理分区。这些技术可根据需求灵活组合,优化存储效率与安全性。
689 0
|
JavaScript
vue中高精度小数问题(加减乘除方法封装)处理
vue中高精度小数问题(加减乘除方法封装)处理
848 0
|
JavaScript 前端开发 Shell
mac和windows上安装nvm管理node版本
NVM(Node Version Manager)是前端开发者常用的命令行工具,用于管理计算机上的不同Node.js版本。通过NVM,开发者可以轻松地在多个项目间切换所需的Node.js版本。在Mac上,可以通过cURL或Wget下载安装脚本,或使用包管理工具brew安装。安装后需配置环境变量以识别NVM命令。Windows用户则可通过专用的nvm-windows安装程序完成安装。常用命令包括安装、卸载特定版本、列出已安装版本等。

热门文章

最新文章