【Vue】自定义防止重复提交指令

本文介绍了一种在Vue项目中防止表单按钮重复提交的有效解决方案。通过自定义一个名为v-preventReClick的指令,可以轻松地控制按钮在一定时间内不可重复点击,有效避免了因重复提交造成的数据混乱或用户体验下降。该指令允许开发者设定延迟时间,提供了一个简洁且可配置的防重复提交机制。

前端开发中防重复提交是一个很头疼又绕不开的话题。
现在我们定义一个指令v-preventReClick让它专门来干这件事。

talk is cheap, show me the code.

v-preventReClick

src/directive/preventReClick.js

/**
 * 防止重复提交指令
 * 参考文档 https://juejin.im/post/5eb7fc626fb9a0436a7c6af1#heading-0
 *
 * @author: tanpeng
 * @date : 2020/5/20 18:08
 * @version: v1.0.0
 */
const preventReClick = {
  install: (Vue, options) => {
    Vue.directive('preventReClick', {
      inserted: (el, binding) => {
        el.addEventListener('click', () => {
          if (!el.disabled) {
            el.disabled = true
            // 传入绑定值就使用,默认3000毫秒内不可重复点击
            setTimeout(() => el.disabled = false, binding.value || 3000)
          }
        })
      }
    })
  }
}

export default preventReClick

usage

src/main.js

import preventReClick from '@/directive/preventReClick'
// 显示声明为全局指令,代码可读性更好
Vue.use(preventReClick)

src/Demo.vue

// 指定延迟时间1000ms
<a-button  size="large" type="primary" v-preventReClick="1000">保 存</a-button>

// 默认延迟时间3000ms
<a-button  size="large" type="primary" v-preventReClick>保 存</a-button>

参考

Vue工程化封装实践系列(二)[表单按钮重复提交,axios重复请求的处理方案]

### 实现按钮防重复点击功能 为了防止用户快速多次点击按钮而导致不必要的请求或操作,在 Vue 应用程序中可以采用多种方法来实现这一目标。一种常见的方式是利用自定义指令结合定时器机制,确保在一定时间内禁用按钮。 #### 使用自定义指令 `v-debounce-click` 创建一个名为 `debounceClick` 的全局自定义指令,该指令会在每次触发点击事件前先清除之前的计时器,再设置一个新的延迟执行的任务。如果在这段时间内再次发生点击,则会重置这个过程[^2]: ```javascript Vue.directive('debounce-click', { bind(el, binding) { let timeout; el.addEventListener('click', () => { clearTimeout(timeout); timeout = setTimeout(() => { binding.value(); }, binding.arg || 300); // 默认延时300毫秒 }); // 解绑时清理资源 el.__timeout__ = timeout; }, unbind(el){ clearTimeout(el.__timeout__); } }); ``` 当应用此指令到按钮上时,只需指定相应的处理逻辑作为参数传递给它即可。例如: ```html <button v-debounce-click="handleSubmit">提交</button> <!-- 或者 --> <button v-debounce-click:500="handleCustomEvent">自定义事件</button> ``` 这里展示了两种不同的方式来配置延迟时间:不带冒号表示使用默认值;而带有冒号则允许开发者自行设定具体的等待间隔(单位为毫秒)。这种方式不仅能够有效阻止短时间内连续点击带来的问题,同时也提高了用户体验的质量。 另外,也可以考虑直接修改按钮的状态属性,如 `disabled` 属性,在点击之后立即将其设为不可用状态,并在网络请求完成后再恢复可用性。这种方法简单直观,适合大多数情况下的需求[^1]。 对于更复杂的应用场景,建议综合运用上述策略以及其他优化措施,比如引入加载指示符或者提示信息等手段进一步提升交互体验[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值