Vue手寫防抖和節(jié)流函數(shù)代碼詳解
1. 手寫防抖debounce
首先介紹一個(gè)防抖的應(yīng)用場景。假如需要監(jiān)聽一個(gè)輸入框在輸入文字后觸發(fā)的change事件,那么通過keyup事件,每次輸入文字后都會觸發(fā)change事件,頻繁觸發(fā)的情況會影響系統(tǒng)的性能。因此可以使用防抖來降低觸發(fā)頻率,即在用戶輸入結(jié)束或暫停時(shí),才會觸發(fā)change事件。
<script>
const input1 = document.getElementById('input1')
// 封裝的防抖函數(shù)
function debounce(fn, delay = 500){
let timer = null
return function(){
if(timer){
clearTimeout(timer)
}
timer = setTimeout(()=>{
fn.apply(this, arguments)
timer = null
}, delay)
}
}
// 調(diào)用防抖函數(shù)
input1.addEventListener('keyup', debounce(function(){
console.log(input1.value)
}, 1000))
</script>在輸入框中輸入內(nèi)容后 1s 才會觸發(fā)事件監(jiān)聽里面的打印功能。

2. 手寫節(jié)流throttle
與防抖在一段時(shí)間之后觸發(fā)事件不同,節(jié)流會以固定頻率觸發(fā)事件。下面介紹一個(gè)節(jié)流的應(yīng)用場景,假如在拖拽一個(gè)元素時(shí),需要隨時(shí)拿到該元素當(dāng)前被拖拽到的位置,如果直接使用drag事件,那么會頻繁觸發(fā)該事件,很容易卡頓。此時(shí)可以使用節(jié)流,即無論拖拽速度有多快,都可以設(shè)置固定的頻率觸發(fā)。
<body>
<div id="div1" draggable="true">可拖拽</div>
<script>
const div1 = document.getElementById('div1')
// 封裝節(jié)流函數(shù)
function throttle(fn, delay = 500){
let timer = null
return function(){
if(timer){
return
}
timer = setTimeout(()=>{
fn.apply(this, arguments)
timer = null
}, delay)
}
}
// 在事件監(jiān)聽里面調(diào)用節(jié)流函數(shù)
div1.addEventListener('drag', throttle(function(e){
console.log(e.offsetX, e.offsetY)
}, 1000))
</script>
</body>
隨著元素被拖拽,本來應(yīng)該迅速觸發(fā)拖拽事件打印元素的坐標(biāo)位置,然而使用節(jié)流將打印元素位置的函數(shù)封裝之后,就會以每隔1000ms的頻率,打印坐標(biāo)位置。

到此這篇關(guān)于JavaScript手寫防抖和節(jié)流函數(shù)代碼詳解的文章就介紹到這了,更多相關(guān)JS防抖和節(jié)流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
探索Vue.js component內(nèi)容實(shí)現(xiàn)
這篇文章主要和大家一起探索Vue.js component內(nèi)容實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
vue中關(guān)于confirm確認(rèn)框的用法
這篇文章主要介紹了vue中關(guān)于confirm確認(rèn)框的用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
在Vue3中使用provide和inject進(jìn)行依賴注入的代碼詳解
在現(xiàn)代前端開發(fā)中,Vue.js已經(jīng)成為了非常流行的框架之一,它提供了極大的靈活性和可維護(hù)性,今天我們要探討的是Vue?3中的provide和inject功能,這是一種用于在組件樹中進(jìn)行依賴注入的方法,需要的朋友可以參考下2024-06-06
typescript中this報(bào)錯(cuò)的解決
這篇文章主要介紹了typescript中this報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

