首先我在写的微信小程序使用uniapp+uview1.X
uview有内置的节流防抖函数,文档解释如下:
我在代码中很多地方为了避免按钮多次触发,使用了防抖函数。like this : @tap="$u.throttle(event, 1000)"
最近测试蓝牙打印的时候就发现了问题,一秒时间内点击3次,打印机在1s,2s,3s,分别吐了标签!所以这个防抖并没有按照文档说明的情况在执行。
看uview源码实现:
乍一看没有问题,函数怎么会执行3次呢?我的推测是这样(大家有不一样的见解欢迎指导):
理想情况每次调用是在一个作用域内,flag始终是同一作用域的flag。但看起来是三次调用大家使用的并不是一个flag,而是三个,他们各自形成了自己的作用域。
以上是我的推测,不一定对,但这个$u.throttle函数肯定是用不了,最后使用了lodash的防抖,leading:true立即执行。
//引入
import { debounce } from "lodash-es";
//方法
event: debounce(function() {
...
}, 2000, {
leading: true
})
最后,再来回顾一下节流和防抖的定义,加深理解。所以uView对节流防抖的解释就与大众的理解是反的,当然,它的实现也是反的。防止表单重复提交应该用的是防抖的概念,而不是节流!