评论

小程序防止重复点击或重复触发事件

网上的方案多数是通过自定义遮罩层的隐现或者wxapi的加载框来阻止,经测试感觉不太理想,而且代码量繁多,过多的渲染也比较耗费性能。所以最后自己总结出以上方案,大佬们有好的解决方案欢迎交流~

可设置全局变量和全局函数,直接使用app唯一实例调用,方便快捷。

在app.js下

App({
  globalData: {
    PageActive: true
  },
  preventActive (fn) {
    const self = this
    if (this.globalData.PageActive) {
      this.globalData.PageActive = false
      if (fn) fn()
      setTimeout(() => {
        self.globalData.PageActive = true
      }, 1500); //设置该时间内重复触发只执行第一次,单位ms,按实际设置
    } else {
      console.log('重复点击或触发')
    }
  }
})


其他page下调用

index.wxml

<button bindtap="tap">点击</button>


index.js

Page({
  tap (e) {
    getApp().preventActive(()=>{
      //code...
    })
  }
})
最后一次编辑于  2021-01-12  
点赞 8
收藏
评论

5 个评论

  • Bealiah
    Bealiah
    2023-08-14

    这算偷懒式防重,不严谨

    2023-08-14
    赞同
    回复
  • 航何美
    航何美
    2023-06-06

    PageActive报错:类型“{ userInfo?: UserInfo | undefined; }”上不存在属性“PageActive”

    是为什么


    2023-06-06
    赞同
    回复
  •  
     
    2022-12-31

    厉害,确实有用又方便!


    2022-12-31
    赞同
    回复
  • JSBin
    JSBin
    2021-01-12
    /**
     * 节流
     * @param fn 需要节流的函数
     * @param t 时间
     */
    export const throttle = (ft, t) => {
      let flag = true
      const interval = t
      return function (this, ...args{
        if (flag) {
          fn.apply(this, args)
          flag = false
          setTimeout(() => {
            flag = true
          }, interval)
        }
      }
    }
    
    
    /**
     * 防抖
     * @param fn 需要防抖的函数
     * @param t 时间
     */
    export const debounce = (fn, t = 300) => {
      let timeId = null
      const delay = t
      return function (this, ...args{
        if (timeId) {
          clearTimeout(timeId)
        }
        timeId = setTimeout(() => {
          timeId = null
          fn.apply(this, args)
        }, delay)
      }
    }
    // js 中使用
    addNumber = debounce(function(thisany){
      this.setData({
       numberthis.data.number + 10
      })
    }, 300)
    reduce = throttle(function(thisany{
      this.setData({
       numberthis.data.number - 1
      })
    }, 1000)
    


    2021-01-12
    赞同
    回复 3
    • 。
      2021-01-14
      防止高频触发,这两个我从其他文章见到过,很实用👍赞
      2021-01-14
      回复
    • ゞ灬じ[爱心]veのポ兆Ζī灬
      ゞ灬じ[爱心]veのポ兆Ζī灬
      2022-03-15
      请问怎么使用啊
      2022-03-15
      回复
    • Dreamer
      Dreamer
      2022-08-17回复ゞ灬じ[爱心]veのポ兆Ζī灬
      2022-08-17
      回复
  • 阿旺
    阿旺
    2021-01-12

    思路不错,代码量确实精简。赞了👍

    2021-01-12
    赞同
    回复 1
    • 。
      2021-01-14
      互相学习研究🤝
      2021-01-14
      回复
登录 后发表内容