什么是防抖和节流?如何理解它们并在不同的场景条件下灵活运用?

🙋‍♂️ 什么是防抖和节流?

防抖(Debouncing)和节流(Throttling)是两种常见的性能优化技术,常用于控制某些操作(例如事件处理器)的频率,从而减少资源消耗并提高性能。

防抖(Debouncing)

防抖是一种在事件被触发后等待一段时间,如果在等待时间内没有再次触发该事件,则执行事件处理器。如果在等待时间内再次触发事件,则重新开始等待。常用于避免短时间内频繁触发的事件处理,例如窗口调整大小、搜索框输入等。

示例代码(JavaScript)
function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

// 示例用法
window.addEventListener('resize', debounce(() => {
    console.log('Window resized');
}, 300));

在这个示例中,当窗口大小变化时,只有在窗口大小停止变化后的300毫秒,console.log('Window resized') 才会被执行。

📹 视频演示(video)

防抖视频

节流(Throttling)

节流是一种在一定时间间隔内只允许函数执行一次,无论该时间间隔内事件被触发了多少次。常用于控制高频率触发的事件处理,例如滚动、鼠标移动等。

示例代码(JavaScript)
function throttle(func, limit) {
    let lastFunc;
    let lastRan;
    return function(...args) {
        const context = this;
        if (!lastRan) {
            func.apply(context, args);
            lastRan = Date.now();
        } else {
            clearTimeout(lastFunc);
            lastFunc = setTimeout(() => {
                if ((Date.now() - lastRan) >= limit) {
                    func.apply(context, args);
                    lastRan = Date.now();
                }
            }, limit - (Date.now() - lastRan));
        }
    };
}

// 示例用法
window.addEventListener('scroll', throttle(() => {
    console.log('Window scrolled');
}, 1000));

在这个示例中,当窗口滚动时,console.log('Window scrolled') 最多每隔1秒执行一次。

📹 视频演示(video)

节流视频

🏁 总结

  • 防抖:在事件停止触发后的指定时间内执行函数。适用于需要等用户停止操作后再处理事件的场景。
  • 节流:在指定时间间隔内最多执行一次函数。适用于需要限制函数执行频率的场景。

🙋‍♂️ 窗口滚动事件一定得用节流吗?不可以使用防抖吗?

窗口滚动事件使用节流和防抖都可以,但取决于具体需求和效果。

使用防抖处理滚动事件

防抖会在用户停止滚动后的一段时间才执行函数,这在某些场景下是有用的,例如:

  • 仅在用户停止滚动时加载数据或执行某些操作。
  • 避免在滚动过程中频繁执行函数,而仅在滚动结束时执行。
示例代码
window.addEventListener('scroll', debounce(() => {
    console.log('Scroll event detected after scrolling stops');
}, 200));

在这个示例中,只有当用户停止滚动200毫秒后,console.log('Scroll event detected after scrolling stops') 才会被执行。

使用节流处理滚动事件

节流会在用户滚动过程中每隔一段时间执行一次函数,这在需要频繁更新页面内容的场景下非常有用,例如:

  • 实时更新滚动进度条。
  • 在滚动过程中动态加载数据(如无限滚动)。
示例代码
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event detected with throttling');
}, 1000));

在这个示例中,console.log('Scroll event detected with throttling') 会在用户滚动过程中最多每隔1秒执行一次。

选择防抖还是节流

  • 防抖:适用于在用户停止滚动后执行操作。例如,停止滚动后加载更多内容或进行一次性计算。
  • 节流:适用于在滚动过程中需要持续执行操作。例如,实时更新界面元素或加载滚动区域内的内容。

🏁 总结

  • 滚动停止后的操作:使用防抖。
  • 滚动过程中的持续操作:使用节流。

根据具体需求选择适合的优化技术可以有效提高应用性能和用户体验。

🙋‍♂️ Vue3组合式 + TypeScript 写法

使用 Vue 3组合式 和 TypeScript语法, 实现窗口调整大小的防抖(debouncing)和滚动事件的节流(throttling)

1. 窗口调整大小的防抖(Debouncing)

<template>
  <div>
    <p>Resize the window and check the console for debounced resize events.</p>
  </div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';

// 防抖函数
function debounce<T extends (...args: any[]) => void>(func: T, wait: number) {
  let timeout: ReturnType<typeof setTimeout>;
  return function(this: any, ...args: Parameters<T>) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), wait);
  };
}

// 防抖处理函数
const handleResize = debounce(() => {
  console.log('Window resized (debounced)');
}, 300);

// 注册和注销事件监听
onMounted(() => {
  window.addEventListener('resize', handleResize);
});

onUnmounted(() => {
  window.removeEventListener('resize', handleResize);
});
</script>

2. 滚动事件的节流(Throttling)

<template>
  <div>
    <p>Scroll the page and check the console for throttled scroll events.</p>
    <div style="height: 2000px;">Scroll content</div>
  </div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';

// 节流函数
function throttle<T extends (...args: any[]) => void>(func: T, limit: number) {
  let lastFunc: ReturnType<typeof setTimeout>;
  let lastRan: number | undefined;
  return function(this: any, ...args: Parameters<T>) {
    const context = this;
    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(() => {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  };
}

// 节流处理函数
const handleScroll = throttle(() => {
  console.log('Scroll event detected (throttled)');
}, 1000);

// 注册和注销事件监听
onMounted(() => {
  window.addEventListener('scroll', handleScroll);
});

onUnmounted(() => {
  window.removeEventListener('scroll', handleScroll);
});
</script>

说明

  1. 防抖(Debouncing):

    • 实现:当窗口大小调整事件触发时,handleResize 函数会在300毫秒内没有进一步的调整后才执行。
    • 用法:当用户调整窗口大小时,防止过多频繁地处理事件,提升性能。
  2. 节流(Throttling):

    • 实现handleScroll 函数会在每1秒内最多执行一次,以控制滚动事件处理的频率。
    • 用法:减少滚动过程中处理事件的频率,优化性能和用户体验。

在 Vue 3 中使用 <script setup lang="ts"> 可以方便地处理生命周期事件,如组件挂载 (onMounted) 和卸载 (onUnmounted),以便正确地添加和移除事件监听器。

当然,你可以将上面的防抖节流函数进行封装公用方法,供组件或模块使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、嵌入式技术(考点篇)试题(1)

我选择C&#xff0c;实际答案选B&#xff0c;答案给出的理由是&#xff0c;SoC是片上系统&#xff0c;包含完整系统和嵌入式软件全部内容&#xff0c;B的说法有点片面。 明显选C&#xff0c;嵌入式跟通用性不太沾边。 嵌入式OS特征&#xff1a;裁剪配置安全可靠实时高确定&…

Python基础知识——(001)

文章目录 P4——3. 程序设计语言的分类 1. 程序设计语言 2. 编译与解释 P5——4. Python语言的简介与开发工具 1. Python语言的简介 2. Python语言的发展 3. Python语言的特点 4. Python的应用领域 5. Python的开发工具 P6——5. IPO编程方式 IPO程序编写方法 P7——6. print函…

大模型隐私窃取攻击

前言 对于大模型风险&#xff0c;目前大家更多关注的还是越狱攻击。隐私这一块&#xff0c;可能国内还不如欧美重视&#xff0c;在安全的学术四大会议论文中&#xff0c;有时候甚至AI隐私的论文比AI安全的论文更多。但实际上&#xff0c;除了越狱之外&#xff0c;另外一大风险…

监控电脑软件【2024最新】|6款软件保姆式解析!

在数字化办公日益普及的今天&#xff0c;很多企业为了更好的提升员工的工作效率和保障企业的数据安全&#xff0c;开始给自己的企业布局电脑监控软件。 但市面上的电脑监控软件种类繁多复杂&#xff0c;为了更好的保障企业利用&#xff0c;小编推荐了以下几款电脑监控软件供大…

阶段三:项目开发---大数据开发运行环境搭建:任务4:安装配置Spark集群

任务描述 知识点&#xff1a;安装配置Spark 重 点&#xff1a; 安装配置Spark 难 点&#xff1a;无 内 容&#xff1a; Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop …

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用&#xff0c;确实会带来很多好处&#xff0c;并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

Java集合升序降序、转Set的方法

Collections.sort(list,Comparator.comparing(OcApplySquareVo::getApplyName).reversed()); 集合转set /** 集合转set */Set<String> pkCodeSet rows.stream().map(RailwayWeighBookResult.RailwayWeighBook::getPkCode).collect(Collectors.toSet());

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

Pytest单元测试系列[v1.0.0][Pytest基础]

Pytest安装与配置 和Unittest一样&#xff0c;Pytest是另一个Python语言的单元测试框架&#xff0c;与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的测试用例。 Pytest 安装 启动命令行&…

A股本周在3000点以下继续筑底,本周依然继续探底?

夜已深&#xff0c;市场传来了3个浓烈的消息&#xff0c;炸锅了&#xff0c;恐有大事发生&#xff0c;马上告诉所有人&#xff1a; 消息面&#xff1a; 1、中国经济周刊首席评论员钮文新称&#xff1a;不要等中小投资者都彻底希望&#xff0c;销户离场了&#xff0c;才发现该…

新恒汇过会一年多注册仍遥遥无期,实控人大额负债入股资金靠借款

《港湾商业观察》施子夫 自2022年6月递表深交所创业板获受理&#xff0c;新恒汇电子股份有限公司 &#xff08;以下简称&#xff0c;新恒汇&#xff09;的上市之路无疑颇显诸多坎坷。2022年7月&#xff0c;深交所下发第一轮审核问询函&#xff1b;同年11月&#xff0c;深交所下…

Bugly的底层是怎么实现的

Bugly 入门 首先&#xff0c;简要介绍什么是 Bugly 以及它的主要功能&#xff1a; Bugly 是什么&#xff1a; Bugly 是腾讯提供的一款移动应用质量监控工具&#xff0c;主要用于捕捉应用的崩溃、ANR&#xff08;应用无响应&#xff09;、卡顿和错误日志。 主要功能&#xff1…

微型导轨如何提升数控机床的稳定性?

数控机床是加工设备中常用的机床&#xff0c;精度和稳定性是衡量数控机床性能的重要指标。而微型导轨作为数控机床中重要的传动元件&#xff0c;数控机床与其具体结构性能是密不可分的&#xff0c;那么微型导轨如何提高数控机床的稳定性呢&#xff1f; 1、微型导轨通过采用先进…

【见刊通知】MVIPIT 2023机器视觉、图像处理与影像技术国际会议

MVIPIT 2023&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/10578343/proceeding 入库Ei数据库需等20-50天左右 第二届会议征稿启动&#xff08;MVIPIT 2024&#xff09; The 2nd International Conference on Machine Vision, Image Processing & Imaging Techn…

暑假提升(3)[平衡二叉树之二--红黑树]

命为志存。 —— 朱熹 红黑树RBTree 1、诞生原因2、红黑树的概念3、红黑树的性质4、红黑树的设计4、1、节点设计4、2、插入操作的设计 5、总结 1、诞生原因 由于二叉树的局限性&#xff0c;进一步出现平衡二叉树&#xff0c;来帮助我们来进一步提升我们对数据的处理&#xff0…

【LabVIEW学习篇 - 1】:初始LabVIEW

文章目录 初始LabView前面板和程序框图前面板&#xff08;Front Panel&#xff09;程序框图&#xff08;Block Diagram&#xff09;交互和工作流程 练手小案例&#xff1a;LabView中实现加法操作 初始LabView LabVIEW&#xff08;Laboratory Virtual Instrument Engineering W…

数据要素资产化路径

一、数据治理&#xff1a;包括数据规范管理、数据治理管理、元数据管理、数据架构管理。 二、数据资产运营&#xff1a;包括数据目录视图、数据全生命周期、数据资产估值、数据资产定价、数据交易流通。 方向1&#xff1a;产业数字化&#xff08;难度系数&#xff1a;*&#…

出现d3dcompiler_43.dll缺失我们要怎么修复?教你科学修复d3dcompiler_43.dll

出现d3dcompiler_43.dll缺失其实也算是一种比较常见的dll文件丢失&#xff0c;毕竟现在很多在使用电脑的时候&#xff0c;都会胡乱的下载东西&#xff0c;然后导致电脑中毒&#xff0c;感染到d3dcompiler_43.dll文件&#xff0c;而导致d3dcompiler_43.dll文件被损坏&#xff0c…