微信小程序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 相关文章推荐
ExtJs Excel导出并下载IIS服务器端遇到的问题
Sep 16 Javascript
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
javascript中打印当前的时间实现思路及代码
Dec 18 Javascript
jquery实现动态画圆
Dec 04 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
angularjs创建弹出框实现拖动效果
Aug 25 Javascript
详解如何使用webpack打包Vue工程
May 27 Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 Javascript
JavaScript循环遍历你会用哪些之小结篇
Sep 28 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 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
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
ucenter通信原理分析
2015/01/09 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
教研活动总结
2014/04/28 职场文书
大学生心理活动总结
2014/07/04 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript