1***@qq.com
1***@qq.com
  • 发布:2023-02-09 18:20
  • 更新:2023-02-12 11:48
  • 阅读:379

请教: uni-app中,如何防止按纽被"快速"地双击2次? ( 倒致程序执行2次)

分类:HBuilderX

我试着用一个变量来控制,但没有效果.

我尝试在 data()定义一个变量,bIsLoginProcess
然后,希望用try...finally...机制, 想禁止同时两次执行onclick
但实际失败了,没有作用.

(我在服务端,仍然发现是同时2次登录了)
(当然,这个问题我可以在服务端控制, 但还有许多单据的保存提交问题,就不好处理了)

哪位仁兄指点一下, 有什么好的方法吗?

<script>  
  export default {  
    data() {  
      return {  
        bIsLoginProcess: false  
      }  
    },  
    methods: {  
      login() {  

        if (this.bIsLoginProcess) {  
          uni.showModal({  
            title: '错误信息',  
            content: '哈哈你重复点了',  
            showCancel: false  
          });  
          return;  
        };  

        try {  
          this.bIsLoginProcess = true;  

          //登录过程.......  

        } finally {  
          this.bIsLoginProcess = false;  
        };  

      }  
    }  
  }  
</script>
2023-02-09 18:20 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com (作者)

我尝试使用 disabled的方式来控制,也证明是无效的(仍可以快速点击2次)

<button type='warn' @tap="login" :disabled="bIsLoginProcess">登录</button>

嘻嘻哈哈S

嘻嘻哈哈S - 1122

使用节流,或调用showLoading

  • 1***@qq.com (作者)

    已证明: :loading="xxxx" 的方式, 无效. 仍可以快速双击两次

    2023-02-10 13:21

  • 嘻嘻哈哈S

    回复 1***@qq.com: 是 uni.showLoading 弹框加载提示, 需要设置 mask: true

    2023-02-13 08:48

西恩十月

西恩十月

防抖函数,用lodash或者uView自带的debounce

1***@qq.com

1***@qq.com (作者)

我试了一下,节流函数是我要的效果.
但是, 无法访问当前界面的变量:

要怎么书写, 才能访问到 this.myUserName 呢?

<script>  

  export default {  
    data() {  
      return {  
        myUserName:'admin'  
      }  
    },  

    methods: {  

      throttled_login: XXXX引用单元.throttle(()=>{  
        console.log(this.myUserName);  //无法访问到  
      }, 5000)  

    }  
  }  
</script>  
  • 嘻嘻哈哈S

    这个 console.log(this.myUserName) 外面没有函数,所以它指向的是 script 就是全局 global

    2023-02-13 08:57

不老刘

不老刘

通过button的disabled 控制就够了吧,有必要搞那么繁琐吗?

  • 1***@qq.com (作者)

    如果我快速双击 , 它会执行两次的.( disabled也是一样, 无法解决)

    2023-02-10 17:05

1***@qq.com

1***@qq.com (作者)

最终方案: 采用"函数节流throttle"在前端控制一下.

同时, 后端采用事务保护机制, 从根源上保证不会重复执行.(不论你如何乱搞,都无法重复执行)

方法:

前端一进入页面时, 生成一个GUID
然后, 保存时, 把这个GUID写入一个表中.

如果已有此GUID(无法重复插入), 那就表示, 你是重复点击.

当然, 这里要用到事务保护功能.(否则仍然可能重复)

当然,更完美的还要有一个1%的机率,删除2天前的GUID.同时配合日期索引,以便保证事务不会互卡!

该问题目前已经被锁定, 无法添加新回复