TypeScript防抖節(jié)流函數(shù)示例詳解
防抖(Debounce):
防抖用于確保一個(gè)函數(shù)在指定時(shí)間內(nèi)只觸發(fā)一次。它在短時(shí)間內(nèi)屢次觸發(fā)同一個(gè)事件時(shí),會(huì)勾銷(xiāo)之前的觸發(fā),直到最初一次觸發(fā)后的肯定工夫距離內(nèi)沒(méi)有新的觸發(fā)才執(zhí)行函數(shù)。
常見(jiàn)的利用場(chǎng)景包含:
- 輸入框?qū)崟r(shí)搜尋:當(dāng)用戶(hù)在輸入框中輸出時(shí),能夠應(yīng)用防抖技術(shù)提早執(zhí)行搜尋查問(wèn),縮小不必要的查問(wèn)和服務(wù)器壓力。
- 窗口大小調(diào)整:當(dāng)用戶(hù)調(diào)整瀏覽器窗口大小時(shí),能夠應(yīng)用防抖技術(shù)防止在調(diào)整過(guò)程中頻繁地從新計(jì)算布局。
- 表單驗(yàn)證:當(dāng)用戶(hù)在表單輸出時(shí),能夠應(yīng)用防抖技術(shù)在用戶(hù)進(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辦法,用于勾銷(xiāo)防抖 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 并且沒(méi)有正在期待執(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ā)得多頻繁。
常見(jiàn)的利用場(chǎng)景包含:
- 滾動(dòng)事件監(jiān)聽(tīng):例如監(jiān)聽(tīng)頁(yè)面滾動(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)畫(huà)成果:當(dāng)實(shí)現(xiàn)一個(gè)基于工夫的動(dòng)畫(huà)成果時(shí),能夠應(yīng)用節(jié)流技術(shù)限度動(dòng)畫(huà)幀率,升高計(jì)算開(kāi)銷(xiāo)。
總之,防抖和節(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è)通過(guò)節(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(); //以后工夫戳 // 如果之前沒(méi)有調(diào)用過(guò),或者工夫距離超過(guò)了設(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數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試
這篇文章主要為大家介紹了TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02xterm.js在web端實(shí)現(xiàn)Terminal示例詳解
這篇文章主要為大家介紹了xterm.js在web端實(shí)現(xiàn)Terminal示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11TypeScript十大排序算法之選擇排序?qū)崿F(xiàn)示例詳解
這篇文章主要為大家介紹了TypeScript十大排序算法之選擇排序?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02詳解什么是TypeScript里的Constructor?signature
這篇文章主要介紹了什么是TypeScript里的Constructor?signature詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07typescript快速上手的進(jìn)階類(lèi)型與技術(shù)
本文講述了typescript開(kāi)發(fā)的一些高級(jí)的類(lèi)型與技術(shù),算是對(duì)于基礎(chǔ)知識(shí)點(diǎn)的補(bǔ)充,具體內(nèi)容包括:比如元組、枚舉類(lèi)、接口、泛型相關(guān)概念等。雖說(shuō)是進(jìn)階,但是內(nèi)容不算多也并不難理解。2022-12-12Typescript編碼規(guī)范ESLint和Prettier使用示例詳解
這篇文章主要介紹了Typescript編碼規(guī)范ESLint和Prettier使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09