淺析Vue 防抖與節(jié)流的使用
在一個(gè)電影項(xiàng)目中,我想在電影的列表中,保存下拉的當(dāng)前位置,防止你切換頁面后,再切換回當(dāng)前的電影列表頁,他就又回到電影的第一條數(shù)據(jù)。
這時(shí)候,我不想每次只要滑動(dòng)一點(diǎn),就保存當(dāng)前位置,我想隔一段時(shí)間,保存一次,這時(shí)候,就可以使用防抖和節(jié)流。
概念
說白了, 防抖節(jié)流就是使用定時(shí)器 來實(shí)現(xiàn)我們的目的。
防抖(debounce):
在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)又被觸發(fā),則重新計(jì)時(shí)。
典型的案例就是輸入框搜索:輸入結(jié)束后n秒才進(jìn)行搜索請(qǐng)求,n秒內(nèi)又輸入的內(nèi)容,則重新計(jì)時(shí)。
節(jié)流(throttle):
規(guī)定在一個(gè)單位時(shí)間內(nèi),只能觸發(fā)一次函數(shù),如果這個(gè)單位時(shí)間內(nèi)觸發(fā)多次函數(shù),只有一次生效。
典型的案例就是鼠標(biāo)不斷點(diǎn)擊觸發(fā),規(guī)定在n秒內(nèi)多次點(diǎn)擊只生效一次。
用法
防抖(debounce)
下拉列表,隔一段時(shí)間保存當(dāng)前下拉位置。
我們可以在 mounted 鉤子中實(shí)現(xiàn)我們的防抖:
// 防抖 定時(shí)器 let timer; //list就是電影列表 ref="list" $el獲取DOM元素 this.$refs.list.$el.addEventListener("scroll", e => { console.log("---->",e.target.scrollTop) //不使用防抖 if (timer) { //清空timer clearTimeout(timer); } timer = setTimeout(() => { console.log(e.target.scrollTop) //使用防抖 //在sessionStorage中保存當(dāng)前下拉位置 // sessionStorage.setItem("position", e.target.scrollTop); }, 75); //75mm為最佳 });
效果演示(隔一段時(shí)間保存當(dāng)前位置):
加 ----> 為不使用防抖,沒加的則使用防抖
輸入框搜索隔段時(shí)間進(jìn)行搜索請(qǐng)求:
<template> <div> <input type="text" @keyup="debounce" /> </div> </template> <script> //定義 timer let timer; export default { methods: { debounce: function() { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { console.log("防抖..."); timer = undefined; }, 2000); } } }; </script>
節(jié)流(throttle)
在n秒內(nèi)點(diǎn)擊多次,只有一次生效。
<template> <div> <button @click="throttle">按鈕</button> </div> </template> <script> //定義 let timer, lastTime; export default { methods: { throttle: function() { let now = +new Date(); if (lastTime && lastTime - now < 200) { //在200ms內(nèi)點(diǎn)擊多次,只有一次生效 clearTimeout(timer); } timer = setTimeout(() => { console.log("點(diǎn)擊..."); lastTime = +new Date(); }, 200); } } }; </script>
效果演示:
補(bǔ)充
當(dāng)然,也可以對(duì)這兩個(gè)方法進(jìn)行封裝,以便在多處使用。
/** * 函數(shù)防抖 (只執(zhí)行最后一次點(diǎn)擊) */ export const Debounce = (fn, t) => { let delay = t || 500; let timer; console.log(fn) console.log(typeof fn) return function () { let args = arguments; if(timer){ clearTimeout(timer); } timer = setTimeout(() => { timer = null; fn.apply(this, args); }, delay); } }; /* * 函數(shù)節(jié)流 */ export const Throttle = (fn, t) => { let last; let timer; let interval = t || 500; return function () { let args = arguments; let now = +new Date(); if (last && now - last < interval) { clearTimeout(timer); timer = setTimeout(() => { last = now; fn.apply(this, args); }, interval); } else { last = now; fn.apply(this, args); } } };
總結(jié)
以上所述是小編給大家介紹的Vue 防抖與節(jié)流的使用,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Vue?element-ui表格內(nèi)嵌進(jìn)度條功能實(shí)現(xiàn)方法
Element-Ul是餓了么前端團(tuán)隊(duì)推出的一款基于Vue.js 2.0 的桌面端UI框架,下面這篇文章主要給大家介紹了關(guān)于Vue?element-ui表格內(nèi)嵌進(jìn)度條功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03Vue CLI3中使用compass normalize的方法
這篇文章主要介紹了Vue CLI3中使用compass normalize的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Vue3+echarts5踩坑以及resize方法報(bào)錯(cuò)的解決
這篇文章主要介紹了Vue3+echarts5踩坑以及resize方法報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07VUE 無限層級(jí)樹形數(shù)據(jù)結(jié)構(gòu)顯示的實(shí)現(xiàn)
在做項(xiàng)目中,會(huì)遇到一些樹形的數(shù)據(jù)結(jié)構(gòu),常用在左側(cè)菜單導(dǎo)航,本文就介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2021-07-07tdesign和vue的子組件關(guān)閉是父組件執(zhí)行方法
這篇文章主要介紹了tdesign和vue的子組件關(guān)閉是父組件執(zhí)行方法,需要的朋友可以參考下2006-06-06Vue2+SpringBoot實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到csv文件并下載的使用示例
本文主要介紹了Vue2+SpringBoot實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到csv文件并下載,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10Vue打包部署到Nginx時(shí),css樣式不生效的解決方式
這篇文章主要介紹了Vue打包部署到Nginx時(shí),css樣式不生效的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08