zoukankan      html  css  js  c++  java
  • 微信小程序:防止多次点击跳转(函数节流)

    场景

    在使用小程序的时候会出现这样一种情况:当网络条件差或卡顿的情况下,使用者会认为点击无效而进行多次点击,最后出现多次跳转页面的情况,就像下图(快速点击了两次):

    解决办法

    然后从 轻松理解JS函数节流和函数防抖 中找到了解决办法,就是函数节流(throttle):函数在一段时间内多次触发只会执行第一次,在这段时间结束前,不管触发多少次也不会执行函数。

    /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得到的thisundefined, 或者想要获取微信组件button传递给点击函数的数据e也是undefined,所以throttle函数还需要做一点处理来使其能用在微信小程序的页面js里。

    出现这种情况的原因是throttle返回的是一个新函数,已经不是最初的函数了。新函数包裹着原函数,所以组件button传递的参数是在新函数里。所以我们需要把这些参数传递给真正需要执行的函数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
            }
        }
    }

    再次点击按钮thise都有了:

    参考

    源代码

    转 : http://www.wxapp-union.com/portal.php?mod=view&aid=3618 

    https://blog.csdn.net/rolan1993/article/details/79170513

  • 相关阅读:
    eclipse的快捷键【转载】
    eclipse调试断点【转载】
    eclipse打断点的调试
    Oracle存储过程的调试
    QT5线程关闭
    QT5 Thread线程
    QT5 文件读写操作
    QT5 Even 事件
    Qt 5 常用类及基本函数
    静态库lib、动态库dll基础
  • 原文地址:https://www.cnblogs.com/fps2tao/p/12186523.html
Copyright © 2011-2022 走看看