前端都應該要掌握的防抖和節流

来源:https://www.cnblogs.com/rainy-night/archive/2022/04/20/16169285.html
-Advertisement-
Play Games

說到防抖和節流相信大家都不陌生,這兩個東西大家可能多多少少都有用到過,最少也有聽。簡單來說,防抖和節流都是用來減少函數執行的頻率,以達到優化項目性能或者實現特定功能的效果。 ...


說到防抖和節流相信大家都不陌生,這兩個東西大家可能多多少少都有用到過,最少也有聽過

古人雲,溫故而知新。雖然可能已經很熟悉防抖和節流了,但不妨再看一看鞏固一下知識

什麼?你說你不僅不會手寫防抖和節流,也沒有聽過。那也沒事,下文會詳細介紹的

防抖和節流有什麼用?

簡單來說,防抖和節流都是用來減少函數執行的頻率,以達到優化項目性能或者實現特定功能的效果

防抖

定義:事件被觸發一定時間後再執行回調。如果在這段時間內又被觸發了,則重新開始計算時間

常用場景

  • 輸入框遠程查詢事件
  • 線上文檔自動保存
  • 瀏覽器視口大小改變

例子

張三在某平臺搜索一本書籍,發現搜索建議並不是瞬間就出現的,而是自己輸入片語結束後出現的。那麼該平臺在此搜索框可能做了什麼操作?

代碼實現

<body>
  <input type="text" id="searchElement" />
</body>
<script>
  const searchElement = document.getElementById('searchElement');
  const debounce = (fn, initial) => {
    let timer = null;
    return () => {
      clearTimeout(timer);
      timer = setTimeout(fn, initial);
    };
  };

  searchElement.oninput = debounce(function (event) {
    const value = searchElement.value;
    if (value) console.log(value, '請求值');
  }, 1000);
</script>

節流

定義:在單位時間內只觸發一次函數,若單位時間內多次觸發只有一次生效

常用場景

  • 按鈕提交事件(當然也可做成點擊後就loading)
  • 頁面滾動事件的觸發
  • 累計計算滑鼠移動距離

例子

張三參加某平臺周年慶活動,他選購了某熱門飲品並一直點擊搶購按鈕,卻發現並不是每次點擊都會有響應的。那麼該平臺前端可能做了什麼限制?

代碼實現

<body>
  <button type="submit" id="buttonElement">搶購</button>
</body>
<script>
  function throttle(fn, interval) {
    let timer;
    return (event) => {
      if (timer) return false;
      timer = setTimeout(() => {
        clearTimeout(timer);
        timer = null;
        fn(event);
      }, interval);
    };
  }

  var btnClick = document.getElementById('buttonElement');
  btnClick.addEventListener('click', throttle(function (event) {
    console.log(event, '點擊了')
  }, 1000));
</script>

可以看到,張三瘋狂點擊搶購,但還是每秒只響應1次

節流(立即執行)

細心的同學可能發現了,上面這個代碼有個弊端,那就是在張三第一次點擊的時候也隔了1秒才響應,這不免也太坑了。正常來說第一次應該直接響應的,並且在連續點擊結束後的第一次也應該立即觸發,其實想實現這樣的效果也不難

<body>
  <button type="submit" id="buttonElement">搶購</button>
</body>
<script>
  function throttle2(fn, interval) {
      let init = false; // 引入一個參數記錄狀態
      let timer;
      return (event) => {
          if (init) return;
          init = true;
          clearTimeout(timer);
          timer = setTimeout(() => {
              init = false;
          }, interval);
          fn(event);
      }
  }

  var btnClick = document.getElementById('buttonElement');
  btnClick.addEventListener('click', throttle2(function (event) {
      console.log(event, '點擊了')
  }, 2000));
</script>

可以看到第一次點擊直接列印,第二次瘋狂點擊只列印一次,最後一次點擊也是直接列印

引入Lodash實現

GitHub地址:https://github.com/lodash/lodash
官方文檔:https://www.lodashjs.com/

防抖

import _ from 'lodash';
debounceHandle: _.debounce(function() {
  console.log('業務代碼');
}, 2000, {       // 在n毫秒內觸發
  leading: true, // 第一次點擊立刻執行,預設為true
  trailing: true // 節流結束後立刻執行,預設為true
});

節流

import _ from 'lodash';
throttleHandle: _.throttle(function() {
  console.log("業務代碼");
}, 2000);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在本文中,我們將介紹 GraphScope 圖互動式查詢引擎 GAIA-IR,它支持高效的 Gremlin 語言表達的交互圖查詢,同時高度抽象了圖上的查詢計算,具有高可擴展性。 ...
  • 在我還在手動調整兩個控制項距離時,第一次見識到了marginStart marginEnd兩個用法, 但是,只知道它倆能夠調整控制項距離,但是不知道具體用法,老師也沒細說,就這樣開啟了我對於這兩個用法“探索”之路 ①首先,我對於兩個控制項之間的調整,是需要將其兩個控制項點連接起來,才能夠被使用。 ②其次,對 ...
  • Xamarin作為微軟提供的移動服務多系統開發平臺,成為很多開發者首選的應用開發平臺。AppGallery Connect(以下簡稱AGC)也在逐步的支持Xamarin的SDK。今天就手把手教大家如何快速接入Xamarin版遠程配置服務。 接入步驟 安裝Xamarin環境 Xamarin的御用開發平 ...
  • HMS Core廣告服務開髮指南中提到“xxxx為測試專用的廣告位ID,App正式發佈時需要改為正式的廣告位ID”,那麼今天咱們就來說說,怎麼獲取正式的廣告位ID。 測試廣告位ID和正式廣告位ID有什麼區別? 測試廣告位ID:不區分應用和條件,在中國大陸和非中國大陸都可以請求廣告,有利於開發者在集成 ...
  • 這幾天電腦有點問題,一直在弄,而且論文也逼近了也在時間弄那個 ,前面node有一個大項目,已經做完了,我現在是準備把上次複習斷下的繼續複習一直到這個項目,然後就開始vue了。 1. 首先是函數的一個進階,要明白函數也是對象,所以是可以通過new的方法來創建實例的。 然後是調用函數的三個方法:call ...
  • 作者:zxg_神說要有光 原文鏈接:https://juejin.cn/post/7087172219226292237 React 的 hooks 是在 fiber 之後出現的特性,所以很多人誤以為 hooks 是必須依賴 fiber 才能實現的,其實並不是,它們倆沒啥必然聯繫。 現在,不止 re ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="wi ...
  • 註釋快捷鍵——ctrl+/ 標題標簽H1-H6 H1-H6屬性:align="left/center/right" 左 中 右 段落標簽 <p></p> <p></p>屬性:align="left/center/right" 左 中 右 換行標簽<br> 分割線<hr> &nbsp:空格 一個漢字占 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...