微信小程序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 相关文章推荐
asp.net+jquery滚动滚动条加载数据的下拉控件
Jun 25 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
Apr 12 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
深入理解jquery中extend的实现
Dec 22 Javascript
Bootstrap选项卡学习笔记分享
Feb 13 Javascript
关于vue.extend和vue.component的区别浅析
Aug 16 Javascript
Vue使用axios出现options请求方法
May 30 Javascript
javascript sort()对数组中的元素进行排序详解
Oct 13 Javascript
vue实现简单的登录弹出框
Oct 26 Javascript
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
浅谈discuz密码加密的方式
2014/05/22 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
php获取excel文件数据
2017/04/21 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
JQuery 小练习(实例代码)
2009/08/07 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
用Python生成器实现微线程编程的教程
2015/04/13 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Django admin美化插件suit使用示例
2017/12/12 Python
python实现接口并发测试脚本
2019/06/25 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
Python如何定义接口和抽象类
2020/07/28 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
成人教育自我鉴定
2013/11/01 职场文书
给朋友的道歉短信
2015/05/12 职场文书
Python 中 Shutil 模块详情
2021/11/11 Python