<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      性能優化之---防抖和節流

      在前端開發中,防抖(Debounce)和節流(Throttle)是兩種常用的性能優化技術,主要用于控制高頻率觸發的事件,避免過多的計算或操作影響性能。

      一、防抖(Debounce)

      1. 原理

      防抖的核心思想是將多次執行變為最后一次執行,即當持續觸發某個事件時,只在事件停止觸發后的指定時間內執行一次回調函數。防抖主要用于減少在短時間內重復觸發的操作。

      2. 實現

      實現防抖的關鍵是使用 setTimeout 來延遲執行回調函數,每次觸發事件時都重新設置計時器,只有在指定時間內沒有再次觸發事件時,才會執行回調函數。

      function debounce(func, wait) {
        let timeout;
        return function (...args) {
          clearTimeout(timeout);
          timeout = setTimeout(() => {
            func.apply(this, args);
          }, wait);
        };
      }

       

      3. 應用場景
      • 搜索框輸入:在用戶停止輸入后再發送請求。
      • 窗口大小調整:在用戶停止調整窗口大小后再執行調整邏輯。
      • 表單驗證:在用戶停止輸入后進行驗證。

       

      二、節流(Throttle)

      1. 原理

      節流的核心思想是在一段時間內只允許一次執行,即當持續觸發某個事件時,在指定時間間隔內只執行一次回調函數。節流主要用于限制在一定時間內的執行次數。

      2. 實現

      實現節流的關鍵是通過 setTimeout 或時間戳來控制回調函數的執行頻率。

      使用時間戳實現
      function throttle(func, wait) {
        let previous = 0;
        return function (...args) {
          const now = Date.now();
          if (now - previous > wait) {
            previous = now;
            func.apply(this, args);
          }
        };
      }

       

      使用 setTimeout 實現

      function throttle(func, wait) {
        let timeout;
        return function (...args) {
          if (!timeout) {
            timeout = setTimeout(() => {
              timeout = null;
              func.apply(this, args);
            }, wait);
          }
        };
      }

       

      3. 應用場景
      • 滾動事件:在用戶滾動過程中限制執行頻率。
      • 頁面縮放:在用戶縮放頁面時限制執行頻率。
      • 按鈕點擊:在短時間內限制按鈕的點擊頻率。

       

      三、結合防抖和節流

      在某些場景下,可能需要結合防抖和節流來實現更加精細的控制。例如,在用戶輸入過程中使用防抖來減少請求次數,同時使用節流來限制請求頻率。

      function debounceThrottle(func, wait, immediate) {
        let timeout, previous = 0;
        return function (...args) {
          const now = Date.now();
          const later = () => {
            timeout = null;
            if (!immediate) func.apply(this, args);
          };
          const callNow = immediate && !timeout;
          clearTimeout(timeout);
          if (now - previous > wait) {
            previous = now;
            if (callNow) func.apply(this, args);
          }
          timeout = setTimeout(later, wait);
        };
      }

       

      四、防抖和節流的對比

      • 防抖:確保在事件停止觸發后的指定時間內只執行一次回調函數,適用于用戶停止操作后的處理。
      • 節流:確保在指定時間間隔內只執行一次回調函數,適用于限制高頻率操作的執行次數。

      五、實際案例

       

      搜索框輸入防抖

      
      

      <template>
      <div>
      <input type="text" v-model="query" @input="handleInput" placeholder="Search...">
      </div>
      </template>

      
      

      <script>
      import { debounce } from 'lodash';

      
      

      export default {
      data() {
      return {
      query: ''
      };
      },
      methods: {
      handleInput: debounce(function () {
      console.log('Search:', this.query);
      // 這里可以發送請求,獲取搜索結果
      }, 300)
      }
      };
      </script>

      
      

      滾動事件節流

      
      

      <template>
      <div @scroll="handleScroll" style="height: 400px; overflow-y: scroll;">
      <div style="height: 1000px;">Scroll me!</div>
      </div>
      </template>

      
      

      <script>
      import { throttle } from 'lodash';

      
      

      export default {
      methods: {
      handleScroll: throttle(function () {
      console.log('Scroll:', window.scrollY);
      // 這里可以處理滾動事件邏輯
      }, 200)
      }
      };
      </script>

       

       

      結合防抖和節流的按鈕點擊

      
      

      <template>
      <div>
      <button @click="handleClick">Click me</button>
      </div>
      </template>

      
      

      <script>
      import { debounceThrottle } from './utils'; // 前面定義的 debounceThrottle 函數

      
      

      export default {
      methods: {
      handleClick: debounceThrottle(function () {
      console.log('Button clicked');
      // 這里可以處理點擊事件邏輯
      }, 500)
      }
      };
      </script>

       

       

      除了手動實現防抖和節流,市面上還有許多工具庫可以幫助我們更方便地使用這些技術。最常用的庫包括 Lodash 和 Underscore。

      • Lodash:一個現代 JavaScript 實用工具庫,提供了包括防抖和節流在內的許多有用函數。

      • Underscore:一個提供類似功能的實用工具庫。

       

      posted @ 2024-07-22 17:17  最小生成樹  閱讀(4208)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中国老太婆video| 伊人天天久大香线蕉av色| 中文字幕一区二区三区四区五区| 亚洲av片在线免费观看| 亚洲精品tv久久久久久久久久| 久久久久久久久久久免费精品| 国产一区二区三区在线观看免费| 欧美老少配性行为| 又大又黄又粗高潮免费| 灵武市| 成人午夜伦理在线观看| 人妻少妇无码精品专区| 国产乱子伦一区二区三区四区五区| 女同亚洲精品一区二区三| 国产精品一区在线蜜臀| 久久这里只精品国产2| 98精品全国免费观看视频| 国产成人免费永久在线平台| 午夜福利影院不卡影院| 麻花传媒在线观看免费| 加勒比亚洲天堂午夜中文| 老鸭窝在钱视频| 国产AV福利第一精品| 国产精品麻豆成人av网| 国产+亚洲+制服| 一本色道国产在线观看二区| 91午夜福利一区二区三区| 亚洲嫩模一区二区三区| 骚虎视频在线观看| 资源新版在线天堂偷自拍| 午夜免费福利小电影| 国产成人免费永久在线平台| 69天堂人成无码免费视频| 四虎永久在线精品无码视频| 超碰人人超碰人人| 免费无码AV一区二区波多野结衣 | 美女午夜福利视频一区二区| 国产一区二区视频啪啪视频 | awww在线天堂bd资源在线| 日韩国产精品无码一区二区三区| 日本成熟少妇激情视频免费看|