防抖和节流

news/2024/11/9 1:38:50/

一、什么是防抖和节流?

在前端开发中,当用户频繁触发某个事件时,很容易出现性能问题或意外行为。为了避免这种情况,我们常常使用两种技术来控制事件的触发次数:防抖(Debounce)和节流(Throttle)。

防抖是指在一定时间内,重复触发同一事件时只执行最后一次操作,也就是说在固定的时间间隔内,只有最后一次操作才会被执行。可以想象为一个开关,只有触发结束才会执行相应的操作。

而节流则是指将连续多个触发合并为一个,在固定的时间间隔内最多只执行一次。可以想象为一个水龙头,每次只会滴下一滴水。如果频率过高,水龙头会将每次滴落的水分别存起来,在固定的时间间隔内统一倒出去。这样可以减少不必要的计算和操作次数,提高性能和用户体验。


二、防抖

防抖有很多场景可用,例如输入框的关键词提示,窗口缩放事件等。它能够减少用户误操作,避免数据的不必要更新和发送请求,提高系统和网页的性能。

防抖的实现方式是通过一个定时器来完成。当事件被触发时,定时器会启动并设定一个时间间隔,如果在这个时间间隔内再次触发该事件,定时器会被清除并重新设定一个新的时间间隔。如果在时间间隔结束后仍未再次触发该事件,那么该事件就会被执行。

下面是一个简单的防抖示例代码:

import timedef debounce(wait):def decorator(func):last_time = 0def inner(*args, **kwargs):nonlocal last_timenow = time.time()if now - last_time < wait:returnresult = func(*args, **kwargs)last_time = time.time()return resultreturn innerreturn decorator@debounce(1)
def do_something():print("Something done.")while True:input_str = input()if input_str == 'q':breakdo_something()

定义了一个 debounce() 装饰器,它接受一个参数 wait,即时间间隔。然后,我们定义了一个闭包函数 inner,用于实现具体的防抖逻辑。在闭包函数中,我们使用了 nonlocal 关键字来修改外部变量 last_time,表示最后一次触发该事件的时间。如果当前时间距离上一次触发事件的时间小于 wait,就不会执行操作,否则就会执行操作并更新最后一次触发事件的时间。

最后,我们将 do_something() 函数进行了防抖装饰,这样无论用户多快地输入,都只会在最后一次输入后输出结果,避免了频繁输出的情况。

三、节流

节流也有很多场景可用,例如滚轮滚动事件、鼠标移动事件等。它能够减少事件的不必要触发和处理,提高系统和网页的性能。

节流的实现方式是通过一个计时器来完成。当事件被触发时,计时器会启动并设置一个时间间隔,如果到达时间间隔后事件仍然在触发,那么事件就会被执行一次。如果在时间间隔内事件没有再次触发,那么计时器会被清除,事件也就不会被执行。这样可以保证事件的触发间隔在规定时间内,减少不必要的事件触发。

下面是一个简单的节流示例代码:

import timedef throttle(wait):def decorator(func):last_time = 0def inner(*args, **kwargs):nonlocal last_timenow = time.time()if now - last_time > wait:result = func(*args, **kwargs)last_time = nowreturn resultreturn innerreturn decorator@throttle(1)
def do_something():print("Something done.")while True:input_str = input()if input_str == 'q':breakdo_something()

同样定义了一个装饰器 throttle(),它也接受一个参数 wait,即时间间隔。然后,我们定义了一个闭包函数 inner,用于实现具体的节流逻辑。在闭包函数中,我们同样使用了 nonlocal 关键字来修改外部变量 last_time,表示最后一次触发该事件的时间。如果当前时间与上一次触发该事件的时间差大于 wait,就会执行操作并更新最后一次触发事件的时间,否则不会执行操作。

最后,我们将 do_something() 函数进行了节流装饰,这样无论用户多快地输入,都只会在每隔 1 秒后输出结果,避免了频繁输出的情况。


http://www.ppmy.cn/news/87492.html

相关文章

(3)---STM32通信

目录 【1】通信的基础知识 【2】USART 【3】串口通信协议 【4】相关寄存器 串口控制寄存器 波特率寄存器 中断和状态寄存器 数据发送寄存器 数据接收寄存器 【5】 USART功能框图 【6】串口发送实验 实验要求 1.观察实物 2.分析原理图 3.STM32CubeMX配置 4、寄存器方式编写…

电脑重装win11系统好还是win10好

随着Windows 11的发布&#xff0c;许多用户开始思考&#xff0c;是应该升级到Windows 11还是继续使用Windows 10&#xff1f;本文将为您比较Windows 11和Windows 10的优势与劣势&#xff0c;帮助您选择适合自己的操作系统。 工具/原料&#xff1a; 系统版本&#xff1a;window…

Java 与排序算法(2):选择排序

一、选择排序 选择排序&#xff08;Selection Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是在待排序序列中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其与序列的第一个元素交换位置&#xff0c;然后在剩余的元素中继续选择最小&#xff0…

《数据可视化》课程期末项目_地理交通数据可视化

2022年上海疫情爆发期间交通数据可视化分析 《数据可视化》课程期末项目报告-选题&#xff1a;地理数据可视化 GitHub源码地址(如果有用点个 star 吧~谢谢&#xff01;) 文章目录 1.0 项目简介2.0 数据简介2.1 航线数据2.2 公交路线数据2.1 项目流程 3.0 数据处理3.1 航线数据…

WIN11+CLion+CMake+MINGW+OPENCV编译需注意问题

安装编译教程可参考以下链接&#xff1a; CLion OpenCV cmake&#xff0c;源码编译及使用_clion编译opencv_拜阳的博客-CSDN博客 使用CLion开发openCV——环境搭建全记录_-Willing-的博客-CSDN博客 此文主要是记录自己在编译过程中遇到的问题和解决方法 1、版本问题 CLi…

Linux下编译支持h264、h265编码的FFmpeg

首先下载x264源码&#xff1a;https://code.videolan.org/videolan/x264/ 解压&#xff0c;进入源码目录&#xff0c;然后执行命令&#xff1a; ./configure --prefix/root/NfsShareDir/trunk/avs/third_party/x264-master/install --enable-static --enable-shared --disabl…

北邮22信通:实验五 共射放大电路的频率特性与深负反馈的影响

北邮22信通一枚~ 很高兴以一个新身份与大家见面~ 关注作者&#xff0c;解锁更多邮苑模电实验报告~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 目录 实验目的&#xff1a; 实验设备及器件&#xff1a; …

贪心算法解决活动选择问题

当涉及到贪心算法时&#xff0c;以下是一个常见的例子&#xff1a;活动选择问题&#xff08;Activity Selection Problem&#xff09;。 问题&#xff1a; 假设有一个会议室&#xff0c;你收到了一系列活动的申请&#xff0c;每个活动都有一个开始时间和结束时间。你的目标是选…