首页 > 其他分享 >性能优化之---防抖和节流

性能优化之---防抖和节流

时间:2024-07-22 17:20:55浏览次数:13  
标签:function 防抖 节流 args --- timeout wait

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的性能优化技术,主要用于控制高频率触发的事件,避免过多的计算或操作影响性能。

一、防抖(Debounce)

1. 原理

防抖的核心思想是将多次执行变为最后一次执行,即当持续触发某个事件时,只在事件停止触发后的指定时间内执行一次回调函数。防抖主要用于减少在短时间内重复触发的操作。

2. 实现

实现防抖的关键是使用 setTimeout 来延迟执行回调函数,每次触发事件时都重新设置计时器,只有在指定时间内没有再次触发事件时,才会执行回调函数。

function debounce(func, wait) {
  let timeout;
  return function (...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, wait);
  };
}

 

3. 应用场景
  • 搜索框输入:在用户停止输入后再发送请求。
  • 窗口大小调整:在用户停止调整窗口大小后再执行调整逻辑。
  • 表单验证:在用户停止输入后进行验证。

 

二、节流(Throttle)

1. 原理

节流的核心思想是在一段时间内只允许一次执行,即当持续触发某个事件时,在指定时间间隔内只执行一次回调函数。节流主要用于限制在一定时间内的执行次数。

2. 实现

实现节流的关键是通过 setTimeout 或时间戳来控制回调函数的执行频率。

使用时间戳实现
function throttle(func, wait) {
  let previous = 0;
  return function (...args) {
    const now = Date.now();
    if (now - previous > wait) {
      previous = now;
      func.apply(this, args);
    }
  };
}

 

使用 setTimeout 实现

function throttle(func, wait) {
  let timeout;
  return function (...args) {
    if (!timeout) {
      timeout = setTimeout(() => {
        timeout = null;
        func.apply(this, args);
      }, wait);
    }
  };
}

 

3. 应用场景
  • 滚动事件:在用户滚动过程中限制执行频率。
  • 页面缩放:在用户缩放页面时限制执行频率。
  • 按钮点击:在短时间内限制按钮的点击频率。

 

三、结合防抖和节流

在某些场景下,可能需要结合防抖和节流来实现更加精细的控制。例如,在用户输入过程中使用防抖来减少请求次数,同时使用节流来限制请求频率。

function debounceThrottle(func, wait, immediate) {
  let timeout, previous = 0;
  return function (...args) {
    const now = Date.now();
    const later = () => {
      timeout = null;
      if (!immediate) func.apply(this, args);
    };
    const callNow = immediate && !timeout;
    clearTimeout(timeout);
    if (now - previous > wait) {
      previous = now;
      if (callNow) func.apply(this, args);
    }
    timeout = setTimeout(later, wait);
  };
}

 

四、防抖和节流的对比

  • 防抖:确保在事件停止触发后的指定时间内只执行一次回调函数,适用于用户停止操作后的处理。
  • 节流:确保在指定时间间隔内只执行一次回调函数,适用于限制高频率操作的执行次数。

五、实际案例

 

搜索框输入防抖


<template>
<div>
<input type="text" v-model="query" @input="handleInput" placeholder="Search...">
</div>
</template>


<script>
import { debounce } from 'lodash';


export default {
data() {
return {
query: ''
};
},
methods: {
handleInput: debounce(function () {
console.log('Search:', this.query);
// 这里可以发送请求,获取搜索结果
}, 300)
}
};
</script>



滚动事件节流


<template>
<div @scroll="handleScroll" style="height: 400px; overflow-y: scroll;">
<div style="height: 1000px;">Scroll me!</div>
</div>
</template>


<script>
import { throttle } from 'lodash';


export default {
methods: {
handleScroll: throttle(function () {
console.log('Scroll:', window.scrollY);
// 这里可以处理滚动事件逻辑
}, 200)
}
};
</script>

 

 

结合防抖和节流的按钮点击


<template>
<div>
<button @click="handleClick">Click me</button>
</div>
</template>


<script>
import { debounceThrottle } from './utils'; // 前面定义的 debounceThrottle 函数


export default {
methods: {
handleClick: debounceThrottle(function () {
console.log('Button clicked');
// 这里可以处理点击事件逻辑
}, 500)
}
};
</script>

 

 

除了手动实现防抖和节流,市面上还有许多工具库可以帮助我们更方便地使用这些技术。最常用的库包括 Lodash 和 Underscore。

  • Lodash:一个现代 JavaScript 实用工具库,提供了包括防抖和节流在内的许多有用函数。

  • Underscore:一个提供类似功能的实用工具库。

 

标签:function,防抖,节流,args,---,timeout,wait
From: https://www.cnblogs.com/zx618/p/18316469

相关文章

  • series智能锁空调全国售后服务电话号码-《今日汇总》
    400服务电话:400-117-1060(点击咨询)series智能锁空调全国售后服务电话号码-《今日汇总》series智能锁全国各售后服务热线号码2024已更新(2024已更新)        series智能锁售后服务维修电话:(1)400-117-1060(点击咨询)(2)400-117-1060(点击咨询)        ......
  • 格雷丁智能锁400客服电话/全国维修总部电话-《今日汇总》
    400服务电话:400-117-1060(点击咨询)格雷丁智能锁400客服电话/全国维修总部电话-《今日汇总》格雷丁智能锁全国各售后服务热线号码2024已更新(2024已更新)        格雷丁智能锁售后服务维修电话:(1)400-117-1060(点击咨询)(2)400-117-1060(点击咨询)       ......
  • 德宝盾智能锁7-24H售后客服报修电话(2024更新号码)
    400服务电话:400-117-1060(点击咨询)德宝盾智能锁7-24H售后客服报修电话(2024更新号码)德宝盾智能锁全国各售后服务热线号码2024已更新(2024已更新)        德宝盾智能锁售后服务维修电话:(1)400-117-1060(点击咨询)(2)400-117-1060(点击咨询)        德宝......
  • VINS-FUSION 优化-先验因子(边缘化)
    一、边缘化VINS中的边缘化策略,将滑出窗外的帧与滑窗内的帧的约束使用边缘化的形式保存为先验误差因子进行后续非线性优化,以保留约束信息。VINS-Fusion优化约束包括:a.视觉误差因子约束,b.IMU预积分约束,c.边缘化先验因子约束文章主要讲述边缘化先验因子约束如何产生。VINS-Fus......
  • 【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜......
  • T240722【1-(二)-3】
    [T240722]证明:\(p,q\)为互质的整数\(\Longrightarrow\forallz\in\C,~(\sqrt[q]z)^p=\sqrt[q]{z^p}\).若\(p,q\)的最大公因数\(d>1\),结论如何?证:设\(p,q\in\mathbb{Z}\andp\perpq,~~z=r(\cos\theta+\mathrmi\sin\theta)\),则\[\begin{aligned}......
  • Verilog程序模块最详细的说明-实现流水灯
    文章目录前言一、Verilog注释二、Verilog关键字三、Verilog模块1.Verillog的基本设计单元是**"模块"(block)**2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.3.每个Verilog模块包括4个主要部分:4.举例-流水灯5.功能定义部分有三种方法:6.模块的调用......
  • 最详细的Verilog阻塞,非阻塞赋值语句介绍--数码管控制段选信号代码
    目录前言一、结构语句1、initial语句2、always语句二、赋值语句1.阻塞赋值2.非阻塞赋值3.总结三、条件语句1if_else语句2.case语句前言本文笔者将为大家详细的介绍Verilog的三种语句介绍,包括结构语句,赋值语句和条件语句一、结构语句1、initial语句initi......
  • iOS开发-多线程编程
    OC中常用的多线程编程技术:1.NSThreadNSThread是Objective-C中最基本的线程抽象,它允许程序员直接管理线程的生命周期。NSThread*myThread=[[NSThreadalloc]initWithTarget:selfselector:@selector(myThreadMainMethod:)object:nil];[myThreadstart];使用NSThread时,......
  • 决策树-ID3
    代码importnumpyasnpdata=np.array([['老年','短发','平底','深色','男性'],['老年','短发','平底','浅色','男性'],['老年','中发','......