视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2020-11-27 21:59:00 责编:小采
文档


问题描述:

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)

})

下载本文
显示全文
专题