首页 > 其他分享 >防抖和节流的应用

防抖和节流的应用

时间:2023-05-13 09:12:47浏览次数:33  
标签:触发 防抖 节流 应用 cancel timerId 函数

防抖(debounce)和节流(throttle)是优化高频触发事件的技术,它们可以提高性能,避免不必要的计算和函数执行。以下是一些实际场景的示例:

  1. 防抖(Debounce):
    防抖用于确保一个函数在一定时间内只触发一次。它在短时间内多次触发同一个事件时,会取消之前的触发,直到最后一次触发后的一定时间间隔内没有新的触发才执行函数。常见的应用场景包括:
  • 输入框实时搜索:当用户在输入框中输入时,可以使用防抖技术延迟执行搜索查询,减少不必要的查询和服务器压力。
  • 窗口大小调整:当用户调整浏览器窗口大小时,可以使用防抖技术避免在调整过程中频繁地重新计算布局。
  • 表单验证:当用户在表单输入时,可以使用防抖技术在用户停止输入一段时间后再执行验证,减少验证的次数。
  1. 节流(Throttle):
    节流用于确保一个函数在一定时间内最多只触发一次。它会在触发事件期间以固定的时间间隔执行函数,而不管事件触发得多频繁。常见的应用场景包括:
    滚动事件监听:例如监听页面滚动到底部加载更多数据时,可以使用节流技术减少检查滚动位置的频率,提高性能。
    鼠标移动事件:例如实现一个拖拽功能,可以使用节流技术减少鼠标移动事件的处理频率。
    动画效果:当实现一个基于时间的动画效果时,可以使用节流技术限制动画帧率,降低计算开销。
    总之,防抖和节流技术都可以在不同场景下提高应用性能。防抖适用于多次触发只需执行一次的情况,而节流适用于限制连续触发事件的执行频率。
/**
 * @description 防抖函数
 * @param {Function} fn
 * @param {number} delay
 * @param {boolean} immediate
 * @returns {Function}
 */
export function debounce<T extends (...args: any[]) => any>(
  fn: T,
  delay: number,
  immediate: boolean = false
): T & { cancel(): void } {
  let timerId: ReturnType<typeof setTimeout> | null = null; // 存储定时器

  // 定义一个cancel方法,用于取消防抖
  const cancel = (): void => {
    if (timerId) {
      clearTimeout(timerId);
      timerId = null;
    }
  };

  const debounced = function (
    this: ThisParameterType<T>,
    ...args: Parameters<T>
  ): void {
    const context = this;
    if (timerId) {
      cancel();
    }
    if (immediate) {
      // 如果 immediate 为 true 并且没有正在等待执行的定时器,立即执行目标函数
      if (!timerId) {
        fn.apply(context, args);
      }
      // 设置定时器,在延迟时间后将 timeoutId 设为 null
      timerId = setTimeout(() => {
        timerId = null;
      }, delay);
    } else {
      // 设置定时器,在延迟时间后执行目标函数
      timerId = setTimeout(() => {
        fn.apply(context, args);
      }, delay);
    }
  };

  // 将 cancel 方法附加到 debounced 函数上
  (debounced as any).cancel = cancel;
  return debounced as T & { cancel(): void };
}

/**
 * 节流函数
 * @param func 要进行节流的目标函数
 * @param delay 节流的时间间隔(毫秒)
 * @returns 返回一个经过节流处理的函数
 */
export function throttle<T extends (...args: any[]) => any>(
  fn: T,
  delay: number
): T {
  let lastCall: number | null = null; // 上一次调用的时间戳

  return function (
    this: ThisParameterType<T>,
    ...args: Parameters<T>
  ): ReturnType<T> | void {
    const now = Date.now(); //当前时间戳
    // 如果之前没有调用过,或者时间间隔超过了设定的值,执行目标函数
    if (!lastCall || now - lastCall >= delay) {
      lastCall = now;
      return fn.apply(this, args);
    }
  } as T;
}

作者:刘晖

标签:触发,防抖,节流,应用,cancel,timerId,函数
From: https://www.cnblogs.com/DTCLOUD/p/17396737.html

相关文章

  • Chrome 开发者工具 network 标签页里获取到的 cookie 字段在 Postman 里的应用
    在Chrome开发者工具中的Network标签页观察HTTP请求时,其中一个常见的字段就是requestheaders。其中的cookie值是指浏览器向服务器发送的Cookie。Cookie是一种服务器存储在客户端计算机上的小文本文件,可以用于存储用户的身份信息、浏览器的偏好设置等信息。在HTTP请......
  • C/C++思考:命令模式在控制中的应用
    目录意义问题用命令模式解决电机控制与输入信号耦合问题与标准命令模式的区别异同意义先说结论:命令模式能有效对代码模块进行解耦,增强模块的扩展性以及可移植性。问题为了方便说明问题,假设现在有一个电机Motor,在识别到外界信号后,通过软件控制其旋转。需要支持的旋转方式为3种:......
  • 09、业务应用程序管理
    一、应用程序管理的概念应用程序管理(ApplicationManagement,AM)提供应用程序的各种服务、流程和方法,用于维护、增强和管理定制的应用程序,打包的软件应用程序和网络交付的应用程序。AM是一种企业范围的IT治理方法,旨在为组织提供最佳的应用程序性能基准程序,并同时整合业务和IT部门,而......
  • linux 系统安全和应用
    目录一、系统安全原因:1.系统数据想要保护,否则会造成数据丢失2.系统安全是产品上线的必要要求3.系统安全可以保护系统,避免受到攻击4.系统安全可以保护数据隐私,避免形象受损 二、账号安全1.锁定锁定文件chattr+i文件(可以多个......
  • Halcon联合C#开发实用版框架,在2.0版本基础上做了修改的,实际项目应用过的版本,源码,修改
    Halcon联合C#开发实用版框架,在2.0版本基础上做了修改的,实际项目应用过的版本,源码,修改了很多Bug,自带有项目运行流程与图片,很适合学习使用,可修改参考用于项目。注:软件能够正常编译运行,使用中遇到Bug自行摸索解决,主要是源码学习参考为主。ID:2619656657567557......
  • Vue3--使用脚手架创建一个vue应用,实现todolist
    一、安装脚手架,运行项目1.1安装,运行首先安装16.0或更高版本的 Node.js然后在cmd安装并执行create-vue它是Vue官方的项目脚手架工具npminitvue@latest可以选装一些功能组件,或者不装,在项目被创建后,通过以下步骤安装依赖并启动开发服务器 依次执行上面的命令,然后......
  • 西门子1200灌装线全线程序,程序分为两部分,一部分为实际应用程序,一部分为仿真程序,程序包
    西门子1200灌装线全线程序,程序分为两部分,一部分为实际应用程序,一部分为仿真程序,程序包含PLC程序和触摸屏程序,内容包含手动,自动运行,模拟量处理,数据统计及存储,故障处理,急停处理,报警等相关程序,程序注释清晰,非常适合初学者学习,该程序支持博图13及以上版本ID:6719655443826436......
  • 三菱Q系列PLC ,QD77MS16走总线控制伺服项目,实际应用的,我写的,网上有人抄袭我的,买了我的
    三菱Q系列PLC,QD77MS16走总线控制伺服项目,实际应用的,我写的,网上有人抄袭我的,买了我的倒手转卖,他提供不了。程序结构清晰明了,通俗易懂,8个伺服,PLC程序有完整的注释,有伺服设定参数,三菱触摸屏程序,电气BOM,电气I/O表,完整的电气图纸,EPLAN画的.适合你直接应用到新的项目。ID:67196558329......
  • 谷歌浏览器无法打开应用商店,无法添加扩展应用
    第一步,打开网址 https://www.crxsoso.com/webstore/category/extensions  或者  https://www.crxsoso.com/  第二步,打开扩展商店,搜索需要添加的扩展应用,点击“安装到浏览器”,左下角提示风险,点击继续,下载后运行,提示无法加载。第三步,打开 chrome://extensions  把下载......
  • 三菱PLC气缸控制程序 此程序已经实际设备上批量应用,程序成熟可靠
    三菱PLC气缸控制程序此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释,可用作新手学习三菱plc气缸动作控制,用的三菱FX3U系列plc,自己辛苦编写的程序。是入门项目级三菱plc电气爱好从业人员借鉴和参考经典案列。ID:725627094863425......