在使用小程序的時候會出現這樣一種狀況:當網絡條件差或卡頓的狀況下,使用者會認爲點擊無效而進行屢次點擊,最後出現屢次跳轉頁面的狀況,就像下圖(快速點擊了兩次):
git
而後從 輕鬆理解JS函數節流和函數防抖 中找到了解決辦法,就是函數節流(throttle):函數在一段時間內屢次觸發只會執行第一次,在這段時間結束前,無論觸發多少次也不會執行函數。github
/utils/util.js:小程序
function throttle(fn, gapTime) { if (gapTime == null || gapTime == undefined) { gapTime = 1500 } let _lastTime = null return function () { let _nowTime = + new Date() if (_nowTime - _lastTime > gapTime || !_lastTime) { fn() _lastTime = _nowTime } } } module.exports = { throttle: throttle }
/pages/throttle/throttle.wxml:微信小程序
<button bindtap='tap' data-key='abc'>tap</button>
/pages/throttle/throttle.js微信
const util = require('../../utils/util.js') Page({ data: { text: 'tomfriwel' }, onLoad: function (options) { }, tap: util.throttle(function (e) { console.log(this) console.log(e) console.log((new Date()).getSeconds()) }, 1000) })
這樣,瘋狂點擊按鈕也只會1s觸發一次。網絡
可是這樣的話出現一個問題,就是當你想要獲取this.data
獲得的this
是undefined
, 或者想要獲取微信組件button
傳遞給點擊函數的數據e
也是undefined
,因此throttle
函數還須要作一點處理來使其能用在微信小程序的頁面js
裏。app
出現這種狀況的緣由是throttle
返回的是一個新函數,已經不是最初的函數了。新函數包裹着原函數,因此組件button
傳遞的參數是在新函數裏。因此咱們須要把這些參數傳遞給真正須要執行的函數fn
。函數
最後的throttle
函數以下:ui
function throttle(fn, gapTime) { if (gapTime == null || gapTime == undefined) { gapTime = 1500 } let _lastTime = null // 返回新的函數 return function () { let _nowTime = + new Date() if (_nowTime - _lastTime > gapTime || !_lastTime) { fn.apply(this, arguments) //將this和參數傳給原函數 _lastTime = _nowTime } } }
再次點擊按鈕this
和e
都有了:
this
throttle
頁面