TypeScript防抖节流函数示例详解

 更新时间:2023年08月18日 09:56:34   作者:freeman_Tian  
这篇文章主要为大家介绍了TypeScript防抖节流函数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

防抖(Debounce):

防抖用于确保一个函数在指定时间内只触发一次。它在短时间内屡次触发同一个事件时,会勾销之前的触发,直到最初一次触发后的肯定工夫距离内没有新的触发才执行函数。

常见的利用场景包含:

  • 输入框实时搜寻:当用户在输入框中输出时,能够应用防抖技术提早执行搜寻查问,缩小不必要的查问和服务器压力。
  • 窗口大小调整:当用户调整浏览器窗口大小时,能够应用防抖技术防止在调整过程中频繁地从新计算布局。
  • 表单验证:当用户在表单输出时,能够应用防抖技术在用户进行输出一段时间后再执行验证,缩小验证的次数。
/**
 * @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 };
}

节流(Throttle):

节流用于确保一个函数在肯定工夫内最多只触发一次。它会在触发事件期间以固定的工夫距离执行函数,而不论事件触发得多频繁。

常见的利用场景包含:

  • 滚动事件监听:例如监听页面滚动到底部加载更多数据时,能够应用节流技术缩小查看滚动地位的频率,进步性能。
  • 鼠标挪动事件:例如实现一个拖拽性能,能够应用节流技术缩小鼠标挪动事件的解决频率。
  • 动画成果:当实现一个基于工夫的动画成果时,能够应用节流技术限度动画帧率,升高计算开销。

总之,防抖和节流技术都能够在不同场景下进步利用性能。防抖实用于屡次触发只需执行一次的状况,而节流实用于限度间断触发事件的执行频率。

/**
 * 节流函数
 * @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;
}

以上就是TypeScript防抖节流实现示例详解的详细内容,更多关于TypeScript防抖节流的资料请关注脚本之家其它相关文章!

相关文章

  • TypeScript 交叉类型使用方法示例总结

    TypeScript 交叉类型使用方法示例总结

    这篇文章主要为大家介绍了TypeScript 交叉类型使用方法示例总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 前端算法之TypeScript包含min函数的栈实例详解

    前端算法之TypeScript包含min函数的栈实例详解

    这篇文章主要为大家介绍了前端算法之TypeScript包含min函数的栈实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 与ChatGPT结对编程实现代码详解

    与ChatGPT结对编程实现代码详解

    这篇文章主要为大家介绍了与ChatGPT结对编写实现代码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Spartacus中navigation item reducer实现解析

    Spartacus中navigation item reducer实现解析

    这篇文章主要为大家介绍了Spartacus中navigation item reducer实现解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 微信小程序实战之运维小项目

    微信小程序实战之运维小项目

    这篇文章主要介绍了微信小程序实战之运维小项目,就是利用微信小程序实现了一个类似138的功能,输入IP就可以查看IP的详细信心,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • TypeScript中的函数重载示例分析

    TypeScript中的函数重载示例分析

    这篇文章主要为大家介绍了TypeScript中的函数重载示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Rollup 简易入门示例教程

    Rollup 简易入门示例教程

    这篇文章主要为大家介绍了Rollup 简易入门示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Typescript tsconfig.json的配置详情

    Typescript tsconfig.json的配置详情

    这篇文章主要为大家介绍了Typescript tsconfig.json的配置详情示例 ,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • TypeScript中的联合类型使用示例详解

    TypeScript中的联合类型使用示例详解

    这篇文章主要为大家介绍了TypeScript中的联合类型使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • TypeScript手写一个简单的eslint插件实例

    TypeScript手写一个简单的eslint插件实例

    这篇文章主要为大家介绍了TypeScript手写一个简单的eslint插件实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论