uniapp項目使用防抖及節流的方案實戰
此方案出現的理由
- 小程序中無法使用vue.directive的指令方法函數實現防抖節流
- 傳統的防抖節流方式相對繁瑣
實現方案及效果
- 新建一個debounce-view組件
- 直接用debounce-view包裹需要防抖的內容即可,如下:
<debounce-view @thTap="buyNow"> <view class="buy-now">立即購買</view> </debounce-view>
防抖組件內容:
//debounce-view <template> <view @click.stop="deTap"> <slot></slot> </view> </template> <script> function deBounce(fn, delay = 500, immediate) { let timer = null, immediateTimer = null; return function() { let args = arguments, context = this; // 第一次觸發 if (immediate && !immediateTimer) { fn.apply(context, args); //重置首次觸發標識,否則下個周期執行時會受幹擾 immediateTimer = setTimeout(() => { immediateTimer = null; }, delay); } // 存在多次執行時,重置動作需放在timer中執行; if (immediateTimer) clearTimeout(immediateTimer); if (timer) clearTimeout(timer); timer = setTimeout(() => { fn.apply(context, args); timer = null; immediateTimer = null; }, delay); } } export default { methods: { deTap: deBounce(function() { console.log('deTap') this.$emit('deTap') }, 500, true), } } </script> <style> </style>
節流組件內容:
<template> <view @click.stop="thTap"> <slot></slot> </view> </template> <script> // 第二版 function throttle(func, wait) { var timeout; var previous = 0; return function() { context = this; args = arguments; if (!timeout) { timeout = setTimeout(function() { timeout = null; func.apply(context, args) }, wait) } } } export default { methods: { thTap: throttle(function() { this.$emit('thTap') }, 500) } } </script> <style> </style>
總結
- 上述方法有有點但也有缺點,優點是使用起來非常的快捷方便,缺點是時間目前是寫死的,各位看官如果有新的想法或者意見還請指教小弟一二
到此這篇關於uniapp項目使用防抖及節流的文章就介紹到這瞭,更多相關uniapp使用防抖及節流內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript防抖動與節流處理
- vue實現防抖的實例代碼
- Vue2.x-使用防抖以及節流的示例
- 在Vue中使用防抖與節流,及this指向的問題
- JavaScript 防抖debounce與節流thorttle