微信小程序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 相关文章推荐
用javascript getComputedStyle获取和设置style的原理
Oct 10 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
Javascript遍历table中的元素示例代码
Jul 08 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
Vue脚手架的简单使用实例
Jul 10 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 Javascript
elementui实现预览图片组件二次封装
Dec 29 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入门经历和学习过程分享
2014/04/11 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
python实现决策树
2017/12/21 Python
Django之路由层的实现
2019/09/09 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
python下载的库包存放路径
2020/07/27 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
给面试官的感谢信
2014/02/01 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
详解Redis复制原理
2021/06/04 Redis