微信小程序BindTap快速连续点击目标页面跳转多次问题处理


Posted in Javascript onApril 08, 2019

问题描述:

1)wxml片段

<view bindtap="loadMulti">
  <text>连续点击,加载多次</text>
</view>
<view bindtap="loadOnce">
  <text>连续点击,加载一次</text>
</view>

2)js代码片段

loadMulti:function(e) {
  wx.navigateTo({
    url: '/pages/loadMulti/index',
  })
},

3)快速,连续点击“连续点击,加载多次”文本串时,我们会发现,目标页面loadMulti/index页面被加载了N次,需要点击N次返回,才可以返回到主页面。

问题原因剖析:

小程序基于MINA框架,该框架的核心框架的核心是一个响应的数据绑定系统,整个系统分为两块视图层(View)和逻辑层(App Service),框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新;当点击按钮的时候,视图层会发送 bindtap的事件给逻辑层,逻辑层找到对应的事件处理函数loadMulti执行。

由于视图层发送bindtap事件给逻辑层并找到对应的处理函数需要时间T1,找到对应的处理函数loadMulti后,执行loadMulti函数:wx.navigateTo, hide 原页面,需要时间T2,如果在T1+T2时间内,快速连续点击N次,完全可以加载显示N次目标页面。

解决方案:

loadOnce:function(e) {
  if (!this.pageLoading) {
   this.pageLoading = !0;
   wx.navigateTo({
    url: '/pages/loadOnce/index',
   })
  }
 },
 onShow: function() {
  this.pageLoading = !1;
}

1)loadOnce事件处理函数中,设置pageLoading = true

2)页面的onShow事件中,设置pageLoading = false

其实我们可以封装成方法:

/**

*解决连续点击多次冲出触发事件

*/

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

    }

  }

}
<button bindtap='tap' data-key='abc'>tap</button>

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)

})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在视频前插入广告
Nov 20 Javascript
javascript 去字符串空格终极版(支持utf8)
Nov 14 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
Nov 10 Javascript
谈谈vue中mixin的一点理解
Dec 12 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
May 16 Javascript
Javascript实现html转pdf高清版(提高分辨率)
Feb 19 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
微信小程序学习总结(五)常见问题实例小结
Jun 04 Javascript
Vue Router中应用中间件的方法
Aug 06 Javascript
vue实现同时设置多个倒计时
May 20 Vue.js
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 #Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 #Javascript
微信小程序实现bindtap等事件传参
Apr 08 #Javascript
详解vue中axios请求的封装
Apr 08 #Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 #Javascript
vue+element+Java实现批量删除功能
Apr 08 #Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 #Javascript
You might like
神族 Protoss 剧情介绍
2020/03/14 星际争霸
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
PHP实现图片自动清理的方法
2015/07/08 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
vue+springboot实现登录验证码
2021/05/27 Vue.js