最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript防抖節(jié)流函數(shù)示例詳解

 更新時(shí)間:2023年08月18日 09:56:34   作者:freeman_Tian  
這篇文章主要為大家介紹了TypeScript防抖節(jié)流函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

防抖(Debounce):

防抖用于確保一個(gè)函數(shù)在指定時(shí)間內(nèi)只觸發(fā)一次。它在短時(shí)間內(nèi)屢次觸發(fā)同一個(gè)事件時(shí),會(huì)勾銷之前的觸發(fā),直到最初一次觸發(fā)后的肯定工夫距離內(nèi)沒有新的觸發(fā)才執(zhí)行函數(shù)。

常見的利用場(chǎng)景包含:

  • 輸入框?qū)崟r(shí)搜尋:當(dāng)用戶在輸入框中輸出時(shí),能夠應(yīng)用防抖技術(shù)提早執(zhí)行搜尋查問,縮小不必要的查問和服務(wù)器壓力。
  • 窗口大小調(diào)整:當(dāng)用戶調(diào)整瀏覽器窗口大小時(shí),能夠應(yīng)用防抖技術(shù)防止在調(diào)整過程中頻繁地從新計(jì)算布局。
  • 表單驗(yàn)證:當(dāng)用戶在表單輸出時(shí),能夠應(yīng)用防抖技術(shù)在用戶進(jìn)行輸出一段時(shí)間后再執(zhí)行驗(yàn)證,縮小驗(yàn)證的次數(shù)。
/**
 * @description 防抖函數(shù)
 * @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; // 存儲(chǔ)定時(shí)器
  // 定義一個(gè)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 并且沒有正在期待執(zhí)行的定時(shí)器,立刻執(zhí)行指標(biāo)函數(shù)
      if (!timerId) {
        fn.apply(context, args);
      }
      // 設(shè)置定時(shí)器,在延遲時(shí)間后將 timeoutId 設(shè)為 null
      timerId = setTimeout(() => {
        timerId = null;
      }, delay);
    } else {
      // 設(shè)置定時(shí)器,在延遲時(shí)間后執(zhí)行指標(biāo)函數(shù)
      timerId = setTimeout(() => {
        fn.apply(context, args);
      }, delay);
    }
  };
  // 將 cancel 辦法附加到 debounced 函數(shù)上
  (debounced as any).cancel = cancel;
  return debounced as T & { cancel(): void };
}

節(jié)流(Throttle):

節(jié)流用于確保一個(gè)函數(shù)在肯定工夫內(nèi)最多只觸發(fā)一次。它會(huì)在觸發(fā)事件期間以固定的工夫距離執(zhí)行函數(shù),而不論事件觸發(fā)得多頻繁。

常見的利用場(chǎng)景包含:

  • 滾動(dòng)事件監(jiān)聽:例如監(jiān)聽頁面滾動(dòng)到底部加載更多數(shù)據(jù)時(shí),能夠應(yīng)用節(jié)流技術(shù)縮小查看滾動(dòng)地位的頻率,進(jìn)步性能。
  • 鼠標(biāo)挪動(dòng)事件:例如實(shí)現(xiàn)一個(gè)拖拽性能,能夠應(yīng)用節(jié)流技術(shù)縮小鼠標(biāo)挪動(dòng)事件的解決頻率。
  • 動(dòng)畫成果:當(dāng)實(shí)現(xiàn)一個(gè)基于工夫的動(dòng)畫成果時(shí),能夠應(yīng)用節(jié)流技術(shù)限度動(dòng)畫幀率,升高計(jì)算開銷。

總之,防抖和節(jié)流技術(shù)都能夠在不同場(chǎng)景下進(jìn)步利用性能。防抖實(shí)用于屢次觸發(fā)只需執(zhí)行一次的狀況,而節(jié)流實(shí)用于限度間斷觸發(fā)事件的執(zhí)行頻率。

/**
 * 節(jié)流函數(shù)
 * @param func 要進(jìn)行節(jié)流的指標(biāo)函數(shù)
 * @param delay 節(jié)流的工夫距離(毫秒)
 * @returns 返回一個(gè)通過節(jié)流解決的函數(shù)
 */
export function throttle<T extends (...args: any[]) => any>(
  fn: T,
  delay: number
): T {
  let lastCall: number | null = null; // 上一次調(diào)用的工夫戳
  return function (
    this: ThisParameterType<T>,
    ...args: Parameters<T>
  ): ReturnType<T> | void {
    const now = Date.now(); //以后工夫戳
    // 如果之前沒有調(diào)用過,或者工夫距離超過了設(shè)定的值,執(zhí)行指標(biāo)函數(shù)
    if (!lastCall || now - lastCall >= delay) {
      lastCall = now;
      return fn.apply(this, args);
    }
  } as T;
}

以上就是TypeScript防抖節(jié)流實(shí)現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript防抖節(jié)流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • TypeScript 交叉類型使用方法示例總結(jié)

    TypeScript 交叉類型使用方法示例總結(jié)

    這篇文章主要為大家介紹了TypeScript 交叉類型使用方法示例總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解

    前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解

    這篇文章主要為大家介紹了前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 與ChatGPT結(jié)對(duì)編程實(shí)現(xiàn)代碼詳解

    與ChatGPT結(jié)對(duì)編程實(shí)現(xiàn)代碼詳解

    這篇文章主要為大家介紹了與ChatGPT結(jié)對(duì)編寫實(shí)現(xiàn)代碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Spartacus中navigation?item?reducer實(shí)現(xiàn)解析

    Spartacus中navigation?item?reducer實(shí)現(xiàn)解析

    這篇文章主要為大家介紹了Spartacus中navigation?item?reducer實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 微信小程序?qū)崙?zhàn)之運(yùn)維小項(xiàng)目

    微信小程序?qū)崙?zhàn)之運(yùn)維小項(xiàng)目

    這篇文章主要介紹了微信小程序?qū)崙?zhàn)之運(yùn)維小項(xiàng)目,就是利用微信小程序?qū)崿F(xiàn)了一個(gè)類似138的功能,輸入IP就可以查看IP的詳細(xì)信心,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • TypeScript中的函數(shù)重載示例分析

    TypeScript中的函數(shù)重載示例分析

    這篇文章主要為大家介紹了TypeScript中的函數(shù)重載示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Rollup 簡易入門示例教程

    Rollup 簡易入門示例教程

    這篇文章主要為大家介紹了Rollup 簡易入門示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Typescript tsconfig.json的配置詳情

    Typescript tsconfig.json的配置詳情

    這篇文章主要為大家介紹了Typescript tsconfig.json的配置詳情示例 ,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • TypeScript中的聯(lián)合類型使用示例詳解

    TypeScript中的聯(lián)合類型使用示例詳解

    這篇文章主要為大家介紹了TypeScript中的聯(lián)合類型使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • TypeScript手寫一個(gè)簡單的eslint插件實(shí)例

    TypeScript手寫一個(gè)簡單的eslint插件實(shí)例

    這篇文章主要為大家介紹了TypeScript手寫一個(gè)簡單的eslint插件實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

河间市| 平泉县| 巴塘县| 临朐县| 乌兰察布市| 邵阳县| 辽中县| 大厂| 中宁县| 灌云县| 邻水| 固始县| 岫岩| 兴城市| 迁安市| 从江县| 勃利县| 浙江省| 山丹县| 朝阳市| 贵溪市| 金川县| 建宁县| 汕尾市| 南京市| 延长县| 郑州市| 广河县| 汤阴县| 任丘市| 大冶市| 丹阳市| 克什克腾旗| 富阳市| 罗甸县| 襄汾县| 江油市| 泰安市| 浦北县| 子洲县| 广河县|