当前位置:网站首页>微信小程序:防止多次点击跳转(函数节流)
微信小程序:防止多次点击跳转(函数节流)
2020-11-06 01:22:00 【:::::::】
场景
在使用小程序的时候会出现这样一种情况:当网络条件差或卡顿的情况下,使用者会认为点击无效而进行多次点击,最后出现多次跳转页面的情况,就像下图(快速点击了两次):
解决办法
然后从 轻松理解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
得到的this
是undefined
, 或者想要获取微信组件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 } } }
再次点击按钮this
和e
都有了:
参考
源代码
- tomfriwel/MyWechatAppDemo 的
throttle
页面
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
版权声明
本文为[:::::::]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1715168
边栏推荐
- 分布式ID生成服务,真的有必要搞一个
- GUI 引擎评价指标
- Details of dapr implementing distributed stateful service
- In depth understanding of the construction of Intelligent Recommendation System
- 技術總監,送給剛畢業的程式設計師們一句話——做好小事,才能成就大事
- 中国提出的AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
- 有关PDF417条码码制的结构介绍
- Elasticsearch database | elasticsearch-7.5.0 application construction
- Menu permission control configuration of hub plug-in for azure Devops extension
- hadoop 命令总结
猜你喜欢
Kitty中的动态线程池支持Nacos,Apollo多配置中心了
mac 安装hanlp,以及win下安装与使用
怎么理解Python迭代器与生成器?
容联完成1.25亿美元F轮融资
使用NLP和ML来提取和构造Web数据
Aprelu: cross border application, adaptive relu | IEEE tie 2020 for machine fault detection
自然语言处理之命名实体识别-tanfordcorenlp-NER(一)
CCR炒币机器人:“比特币”数字货币的大佬,你不得不了解的知识
hadoop 命令总结
业内首发车道级导航背后——详解高精定位技术演进与场景应用
随机推荐
连肝三个通宵,JVM77道高频面试题详细分析,就这?
ipfs正舵者Filecoin落地正当时 FIL币价格破千来了
【Flutter 實戰】pubspec.yaml 配置檔案詳解
数据产品不就是报表吗?大错特错!这分类里有大学问
Don't go! Here is a note: picture and text to explain AQS, let's have a look at the source code of AQS (long text)
快快使用ModelArts,零基礎小白也能玩轉AI!
7.2.1 cache configuration of static resources
如果前端不使用SPA又能怎样?- Hacker News
Ubuntu18.04上安裝NS-3
Cocos Creator 原始碼解讀:引擎啟動與主迴圈
使用NLP和ML来提取和构造Web数据
微服務 - 如何解決鏈路追蹤問題
drf JWT認證模組與自定製
PLC模拟量输入和数字量输入是什么
【QT】 QThread部分原始碼淺析
Flink的DataSource三部曲之二:内置connector
使用Asponse.Words處理Word模板
Elasticsearch 第六篇:聚合統計查詢
多机器人行情共享解决方案
被老程式設計師壓榨怎麼辦?我不想辭職