方法一:利用定时器设置时间,下方代码设置时间为1秒
但是有个缺点:请求如果很慢,1秒钟还没有好,那么该方法就没用了
// 利用定时器:1秒之后才能再次点击
app.directive('preventReClick', {
mounted: (el, binding) => {
el.addEventListener('click', () => {
if (!el.disabled) {
el.disabled = true
setTimeout(() => {
el.disabled = false
}, binding.value || 1000)
}
})
}
})
方法二:传入请求的函数作为参数,根据请求的finally来判断是否可以点击了,更推荐!!!
但是传入的参数必须是一个promise函数,否则就没用了
//自定义指令版本2:根据请求结果防止按钮重复提交请求
//使用方式:传递一个请求函数,比如v-prevent-dup-click="submit"
app.directive('preventDupClick', {
mounted(el, binding) {
//传递的参数必须是一个函数,否则报错
if (typeof binding.value !== 'function') {
throw new Error('v-prevent-dup-click instruction can transmit only A function')
}
// 一开始是未点击状态
el.isClicked = false
const handerClick = function (event) {
// 如果已经点击过,则阻止事件
if (el.isClicked === 'true') {
event.preventDefault()
event.stopPropagation()
return
}
// 标记为已点击
el.isClicked = 'true'
// 调用传入的函数
binding.value().finally(() => {
el.isClicked = 'false'
})
}
el.hander = handerClick
el.addEventListener('click', handerClick)
},
//销毁事件
beforeUnmount(el) {
if (el.hander) {
el.removeEventListener('click', el.hander)
}
}
})