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

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

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

      防抖節(jié)流函數(shù)及延伸

      常規(guī)防抖節(jié)流函數(shù)

      方法

      function debounce(fn, delay = 500) {
          let timeout = null;
          
          return function() {
              if (timeout) {
                  clearTimeout(timeout)
              }
              timeout= setTimeout(() => {
                  fn.apply(this, arguments)
                  timeout = null
              }, delay)
          }
      }
      
      function throttle(fn, delay) {
          let timeout = null
          
          return function() {
              if (timeout) {
                  return
              }
              timeout = setTimeout(() => {
                  fn.apply(this, arguments)
                  timeout = null
              }, delay)
          }
      }
      

      使用

      onclick:debounce(實(shí)際操作函數(shù), 時(shí)間)
      onclick:throttle(實(shí)際操作函數(shù), 時(shí)間)
      

      實(shí)際使用出現(xiàn)的問題

      • 使用閉包來區(qū)分不同按鈕的操作,也正因?yàn)槿绱藷o法進(jìn)行多按鈕處理
      • 對(duì)于持續(xù)性操作(滾動(dòng),縮放)應(yīng)當(dāng)使用節(jié)流操作,但無法保證最后一次操作執(zhí)行

      優(yōu)化后

      方法

      type Config = {
          fn: () => void; // 待執(zhí)行的函數(shù)
          key: string;    // 唯一標(biāo)識(shí)符,用于區(qū)分不同的操作
          time: number;   // 延遲時(shí)間,單位毫秒
      }
      
      type ConfigParams = Config['fn'] | {
          fn: Config['fn'],
          key?: Config['key'],
          time?: Config['time']
      }
      
      /** 延遲集合,記錄每個(gè) key 對(duì)應(yīng)的延遲信息 */
      const delayMap: Record<string, { fn: Config['fn'], timeout: number }> = {}
      
      /** 獲取配置項(xiàng),合并默認(rèn)配置和傳入的配置 */
      function getConfig(configParams: ConfigParams, key: Config['key'], time: Config['time']): Config {
          let config: Config = { fn: () => { }, key, time }
      
          if (typeof configParams === 'function') {
              // 如果傳入的是函數(shù)類型,則賦值給 fn
              config.fn = configParams
          } else if (typeof config === 'object') {
              // 如果傳入的是對(duì)象類型,則合并對(duì)象配置
              config = { ...config, ...configParams }
          }
      
          return config
      }
      
      /** 記錄延遲,并在設(shè)定時(shí)間后執(zhí)行內(nèi)部方法 */
      function delayTimeOut(key: Config['key'], time: Config['time']) {
          if (!time) return; // 如果時(shí)間為 0 或者無效時(shí)間,跳過
      
          // 清理已有的延遲操作
          const clearFn = () => {
              clearTimeout(delayMap[key].timeout)
              delete delayMap[key];
          }
      
          // 記錄當(dāng)前的延遲操作
          delayMap[key] = {
              fn: clearFn, // 默認(rèn)的清理函數(shù)
              timeout: setTimeout(() => {
                  // 延遲時(shí)間到達(dá)時(shí),執(zhí)行傳入的待執(zhí)行函數(shù)
                  if (delayMap[key]) delayMap[key].fn();
      
                  // 若延遲未被清理,說明更換了內(nèi)部方法(執(zhí)行了有效操作)
                  if (delayMap[key]) {
                      clearFn()// 清理當(dāng)前延遲
                      delayTimeOut(key, time);// 重新記錄延遲操作
                  }
              }, time)
          }
      }
      
      /** 防抖函數(shù):延遲執(zhí)行,若在延遲時(shí)間內(nèi)重復(fù)觸發(fā),清除之前的延遲操作 */
      export function debounce(configParams: ConfigParams) {
          if (!configParams) return // 如果沒有傳入配置,直接返回
      
          const config = getConfig(configParams, 'debounce', 750) // 獲取完整配置
      
          // 如果已經(jīng)有相同 key 的延遲操作在進(jìn)行,清除之前的延遲
          if (delayMap[config.key]) {
              clearTimeout(delayMap[config.key].timeout)
              delete delayMap[config.key];
          }
      
          // 開啟新的延遲操作
          delayTimeOut(config.key, config.time);
          delayMap[config.key].fn = config.fn// 記錄新的待執(zhí)行函數(shù)
      }
      
      /** 節(jié)流函數(shù):規(guī)定時(shí)間內(nèi)只執(zhí)行一次,防止過于頻繁的調(diào)用 */
      export function throttle(configParams: ConfigParams) {
          if (!configParams) return // 如果沒有傳入配置,直接返回
      
          const config = getConfig(configParams, 'throttle', 750) // 獲取完整配置
      
          // 如果當(dāng)前沒有延遲操作,則立即執(zhí)行待執(zhí)行函數(shù)
          if (!delayMap[config.key]) {
              config.fn()
              delayTimeOut(config.key, config.time);
          }
      }
      
      /** 延遲函數(shù):相比節(jié)流函數(shù)會(huì)在等待時(shí)間中記錄并在結(jié)束后執(zhí)行最后一次操作保證數(shù)據(jù)準(zhǔn)確 */
      export function delay(configParams: ConfigParams) {
          if (!configParams) return // 如果沒有傳入配置,直接返回
      
          const config = getConfig(configParams, 'delay', 100) // 獲取完整配置
      
          // 如果尚未開啟延遲操作,執(zhí)行一次后開啟延遲;如果已經(jīng)開啟延遲,則更換內(nèi)部方法
          if (!delayMap[config.key]) {
              config.fn()
              delayTimeOut(config.key, config.time);
          } else {
              delayMap[config.key].fn = config.fn;
          }
      }
      

      使用

      onclick(){
        debounce(實(shí)際操作函數(shù))
        // 或
        debounce({fn:實(shí)際操作函數(shù),time:時(shí)間,key:標(biāo)識(shí)})
      }
      onclick(){
        throttle(實(shí)際操作函數(shù))
        // 或
        throttle({fn:實(shí)際操作函數(shù),time:時(shí)間,key:標(biāo)識(shí)})
      }
      onclick(){
        delay(實(shí)際操作函數(shù))
        // 或
        delay({fn:實(shí)際操作函數(shù),time:時(shí)間,key:標(biāo)識(shí)})
      }
      

      說明

      • delay是節(jié)流方法的延伸,添加了最后執(zhí)行一次的邏輯,處理高頻且保證結(jié)果準(zhǔn)確
      • 使用顯式調(diào)用使用key關(guān)鍵字作為區(qū)分,可有效解決多按鈕功能重復(fù)等帶來的節(jié)流難題
      posted @ 2023-08-02 16:08  杜柯楓  閱讀(59)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 人妻在线无码一区二区三区| 亚洲熟妇色自偷自拍另类| 撩起胸让我的?蹭来蹭去| 亚洲成年轻人电影网站WWW| 无码人妻aⅴ一区二区三区蜜桃| 免费人妻无码不卡中文18禁| 亚洲av网一区天堂福利| 无码人妻一区二区三区精品视频| 亚洲av无码精品蜜桃| 国产在线中文字幕精品| 日韩精品中文字幕第二页| 亚欧美闷骚院| 超碰人人超碰人人| 大地资源中文第二页日本| 一区二区三区不卡国产| 亚洲一区二区av免费| 亚洲熟女综合色一区二区三区| free性开放小少妇| 免费又爽又大又高潮视频| 激情久久综合精品久久人妻| 国产成人无码免费看视频软件 | 淮滨县| 婷婷综合亚洲| 久久99精品久久久久久青青| 欧美亚洲熟妇一区二区三区| 亚洲国产一区二区在线| 深夜福利啪啪片| 蜜桃视频在线观看网站免费| 男女激情一区二区三区| a级国产乱理伦片在线观看al | 91久久性奴调教国产免费| 97成人碰碰久久人人超级碰oo| 精品国产一区AV天美传媒| 久久天天躁狠狠躁夜夜2020老熟妇| 日韩精品国产精品十八禁| 99热门精品一区二区三区无码| 人人妻碰人人免费| 日韩在线成年视频人网站观看| 91网站在线看| 国产午夜亚洲精品国产成人 | 日韩精品国内国产一区二|