亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

如何解決js函數防抖、節流出現的問題

2024-05-06 16:52:19
字體:
來源:轉載
供稿:網友

React中使用防抖函數和節流函數

在React事件調用時,React傳遞給事件處理程序是一個合成事件對象的實例。SyntheticEvent對象是通過合并得到的。 這意味著在事件回調被調用后,SyntheticEvent 對象將被重用并且所有屬性都將被取消。 這是出于性能原因。 因此,您無法以異步方式訪問該事件。React合成事件官方文檔

所以在用防抖或節流函數封裝時,異步方式訪問事件對象出現問題。解決的方法如下:

方法一:調用合成事件對象的persist()方法 event.persist && event.persist() //保留對事件的引用

方法二:深拷貝事件對象 const event = e && {...e} //深拷貝事件對象

function debounce(func, wait=500) {let timeout; // 定時器變量return function(event){clearTimeout(timeout); // 每次觸發時先清除上一次的定時器,然后重新計時event.persist && event.persist() //保留對事件的引用//const event = e && {...e} //深拷貝事件對象timeout = setTimeout(()=>{func(event)}, wait); // 指定 xx ms 后觸發真正想進行的操作 handler};}

防抖debounce

防抖 Debounce 多次觸發,只在最后一次觸發時,執行目標函數。

函數防抖就是,延遲一段時間再執行函數,如果這段時間內又觸發了該函數,則延遲重新計算。

應用場景

(1)通過監聽某些事件完成對應的需求,比如:

通過監聽 scroll 事件,檢測滾動位置,根據滾動位置顯示返回頂部按鈕

通過監聽 resize 事件,對某些自適應頁面調整DOM的渲染(通過CSS實現的自適應不再此范圍內)

通過監聽 keyup 事件,監聽文字輸入并調用接口進行模糊匹配

(2)其他場景

表單組件輸入內容驗證

防止多次點擊導致表單多次提交

簡單實現

function debounce(fn, wait) {let treturn () => {let context = thislet args = argumentsif (t) clearTimeout(t)t= setTimeout(() => {fn.apply(context, args)}, wait)}}

完整實現

function debounce(func, wait, immediate) {let time;let debounced = function() {let context = this;if(time) clearTimeout(time);if(immediate) {let callNow = !time;if(callNow) func.apply(context, arguments);time = setTimeout(()=>{time = null} //見注解, wait)} else {time = setTimeout(()=>{func.apply(context, arguments)}, wait) }};debounced.cancel = function() {clearTimeout(time);time = null};return debounced}// underscore.js debounce//// Returns a function, that, as long as it continues to be invoked, will not// be triggered. The function will be called after it stops being called for// N milliseconds. If `immediate` is passed, trigger the function on the// leading edge, instead of the trailing._.debounce = function(func, wait, immediate) {var timeout, args, context, timestamp, result;// 處理時間var later = function() {var last = _.now() - timestamp;if (last < wait && last >= 0) {timeout = setTimeout(later, wait - last); // 10ms 6ms 4ms} else {timeout = null;if (!immediate) {result = func.apply(context, args);if (!timeout) context = args = null;}}};

react中調用方法

this.handleGetCustomerNameList = debounce(this.handleGetCustomerNameList.bind(this), 500);

節流 throttle

節流:函數間隔一段時間后才能再觸發,避免某些函數觸發頻率過高,比如滾動條滾動事件觸發的函數。

### 簡單實現function throttle (fn, wait, mustRun) {let start = new Date()let timeoutreturn () => {// 在返回的函數內部保留上下文和參數let context = thislet args = argumentslet current = new Date()clearTimeout(timeout)let remaining = current - start// 達到了指定觸發時間,觸發該函數if (remaining > mustRun) {fn.apply(context, args)start = current} else {// 否則wait時間后觸發,閉包保留一個timeout實例timeout = setTimeout(fn, wait);}}}

完整實現

function throttle(func, wait, options) {let time, context, args, result;let previous = 0;if (!options) options = {};let later = function () {previous = options.leading === false ? 0 : new Date().getTime();time = null;func.apply(context, args);if (!time) context = args = null;};let throttled = function () {let now = new Date().getTime();if (!previous && options.leading === false) previous = now;let remaining = wait - (now - previous);context = this;args = arguments;if (remaining <= 0 || remaining > wait) {if (time) {clearTimeout(time);time = null;}previous = now;func.apply(context, args);if (!time) context = args = null;} else if (!time && options.trailing !== false) {time = setTimeout(later, remaining);}};return throttled;}// underscore.js throttle// Returns a function, that, when invoked, will only be triggered at most once// during a given window of time. Normally, the throttled function will run// as much as it can, without ever going more than once per `wait` duration;// but if you'd like to disable the execution on the leading edge, pass// `{leading: false}`. To disable execution on the trailing edge, ditto._.throttle = function(func, wait, options) {var context, args, result;var timeout = null;var previous = 0;if (!options) options = {};var later = function() {previous = options.leading === false ? 0 : _.now();timeout = null;result = func.apply(context, args);if (!timeout) context = args = null;};return function() {var now = _.now();if (!previous && options.leading === false) previous = now;var remaining = wait - (now - previous);context = this;args = arguments;if (remaining <= 0 || remaining > wait) {if (timeout) {clearTimeout(timeout);timeout = null;}previous = now;result = func.apply(context, args);if (!timeout) context = args = null;} else if (!timeout && options.trailing !== false) {timeout = setTimeout(later, remaining);}return result;};};

react中調用方法

this.handleGetCustomerNameList = throttle (this.handleGetCustomerNameList.bind(this), 500);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久激情视频| 国产女精品视频网站免费| 成人精品一区二区三区电影黑人| 久久久久久网站| 日韩欧美中文字幕在线播放| 日韩久久免费电影| 欧美成人高清视频| 俺也去精品视频在线观看| 国产一区在线播放| 国产亚洲人成网站在线观看| 在线视频亚洲欧美| 国产精品免费观看在线| 亚洲人成毛片在线播放| 亚洲人精品午夜在线观看| 欧美极品少妇xxxxⅹ喷水| 亚洲国产精品va在线看黑人动漫| 欧美超级乱淫片喷水| 91精品国产综合久久久久久久久| 欧美成人免费播放| 亚洲第一区中文字幕| 日韩a**站在线观看| 亚洲欧美国产制服动漫| www.日韩av.com| 日本一本a高清免费不卡| 日韩专区中文字幕| 亚洲成成品网站| 色老头一区二区三区在线观看| 国内揄拍国内精品少妇国语| 日韩中文字幕免费| 亚洲国产欧美久久| 国产精品人成电影| 久久亚洲精品国产亚洲老地址| 亚洲欧美日本精品| 国产狼人综合免费视频| 在线播放日韩欧美| 成人网址在线观看| 黑人与娇小精品av专区| 精品国产欧美一区二区三区成人| 久久精品视频中文字幕| 亚洲а∨天堂久久精品9966| 欧美一性一乱一交一视频| 日韩成人xxxx| 亚洲一区二区黄| 黄色成人av在线| 午夜精品福利电影| 欧美日韩国产123| 日韩精品免费看| 欧美中文在线观看| 一本久久综合亚洲鲁鲁| 欧美黑人极品猛少妇色xxxxx| 亚洲精品aⅴ中文字幕乱码| 精品久久久精品| 成人激情视频在线播放| 欧美性videos高清精品| 麻豆一区二区在线观看| 欧美成人午夜影院| 久久久久久久激情视频| 精品亚洲aⅴ在线观看| 国产在线视频不卡| 国内外成人免费激情在线视频| 久久精品国产视频| 欧美日韩在线观看视频| 2019中文字幕免费视频| 久久久精品一区二区| 国内自拍欧美激情| 国产免费观看久久黄| 国产精品美女www爽爽爽视频| 久久久精品欧美| 亚洲成人精品久久| 亚洲成av人影院在线观看| 中文字幕日韩免费视频| 国产香蕉97碰碰久久人人| 国产不卡一区二区在线播放| 欧美交受高潮1| 中文字幕视频在线免费欧美日韩综合在线看| 中文字幕在线视频日韩| www.精品av.com| 国产精品福利网站| 国产精品黄视频| 亚洲精品久久久久久久久久久久| 久久精品视频在线| 成人精品一区二区三区电影黑人| 亚洲深夜福利网站| 欧美成人全部免费| 中文字幕在线视频日韩| 欧美二区在线播放| 欧美香蕉大胸在线视频观看| 国产精品综合网站| 欧美性色视频在线| 综合激情国产一区| 亚洲国产高潮在线观看| 亚洲精品自产拍| 97国产精品视频| 国产亚洲欧美视频| 亚洲aⅴ男人的天堂在线观看| 亚洲精品动漫100p| 国产精品露脸自拍| 成人黄色网免费| 国产91热爆ts人妖在线| 日韩av影视综合网| 欧美日韩国内自拍| 欧美电影免费播放| 久久国产视频网站| 97在线看福利| 国产精品av在线播放| 日本欧美一二三区| 日韩专区中文字幕| 国产成人精品日本亚洲专区61| 亚洲自拍偷拍区| 亚洲jizzjizz日本少妇| 国产精品91在线观看| 欧美性xxxxx极品娇小| 日韩av免费看| 91wwwcom在线观看| 国产日韩中文字幕| 国产成人精品一区二区三区| 国模精品系列视频| 2020国产精品视频| 欧美孕妇孕交黑巨大网站| 成人深夜直播免费观看| 亚洲精品自拍视频| 伊人久久综合97精品| 日本精品视频在线播放| 在线视频亚洲欧美| 欧美日韩一区二区免费在线观看| www.亚洲免费视频| 欧美国产亚洲视频| 精品动漫一区二区三区| 久久99久久亚洲国产| 日韩在线观看免费全| 亚洲精品午夜精品| 欧美中在线观看| 欧美日韩国产精品一区二区不卡中文| 日韩一区av在线| 久久久999国产精品| 在线午夜精品自拍| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲夜晚福利在线观看| 亚洲一区二区三| 久久99亚洲精品| 热门国产精品亚洲第一区在线| 国产日产久久高清欧美一区| 国产精品欧美一区二区三区奶水| 久久亚洲精品中文字幕冲田杏梨| 精品视频中文字幕| 不卡伊人av在线播放| 久久国产精品视频| 亚洲a∨日韩av高清在线观看| 国产精品视频公开费视频| 欧美视频在线免费看| 91在线观看免费高清完整版在线观看| 国内外成人免费激情在线视频| 欧美性极品xxxx做受| 国产精品久久久av久久久| 在线国产精品播放| 国产小视频国产精品| 亚洲精品福利在线| 亚洲小视频在线| 中文字幕亚洲色图| 久久成人这里只有精品| 久热精品视频在线| 91爱爱小视频k| 欧美在线视频a| 日韩精品视频三区|