小程序模板網

防止小程序多次點擊跳轉解決方案

發(fā)布時間:2018-05-05 15:11 所屬欄目:小程序開發(fā)教程

場景

在使用小程序的時候會出現這樣一種情況:當網絡條件差或卡頓的情況下,使用者會認為點擊無效而進行多次點擊,最后出現多次跳轉頁面的情況,就像下圖(快速點擊了兩次):

解決辦法

然后從 輕松理解JS函數節(jié)流和函數防抖 中找到了解決辦法,就是函數節(jié)流(throttle):函數在一段時間內多次觸發(fā)只會執(zhí)行第一次,在這段時間結束前,不管觸發(fā)多少次也不會執(zhí)行函數。

/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觸發(fā)一次。

但是這樣的話出現一個問題,就是當你想要獲取this.data得到的this是undefined, 或者想要獲取微信組件button傳遞給點擊函數的數據e也是undefined,所以throttle函數還需要做一點處理來使其能用在微信小程序的頁面js里。

出現這種情況的原因是throttle返回的是一個新函數,已經不是最初的函數了。新函數包裹著原函數,所以組件button傳遞的參數是在新函數里。所以我們需要把這些參數傳遞給真正需要執(zhí)行的函數fn。

最后的throttle函數如下:

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都有了:

參考

  • 輕松理解JS函數節(jié)流和函數防抖

源代碼

  • tomfriwel/MyWechatAppDemo 的throttle頁面


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://www.u-renovate.com/wxmini/doc/course/24269.html 復制鏈接 如需定制請聯系易優(yōu)客服咨詢:800182392 點擊咨詢
QQ在線咨詢