当前位置: 首页 > article >正文

使用 Element-UI 中的 el-button 添加防抖指令防止重复提交

使用 Element-UI 中的 el-button 添加防抖指令防止重复提交

在现代 Web 开发中,防止用户在短时间内多次点击提交按钮是一个常见的需求。重复点击可能导致表单数据被多次提交,从而引发一系列问题。本文将介绍如何在 Vue.js 项目中使用自定义指令来实现按钮的防抖功能,防止用户在短时间内多次点击提交按钮。

  1. 问题背景
    在使用 Element-UI 的 el-button 组件时,如果用户在短时间内多次点击提交按钮,可能会导致表单数据被多次提交。为了避免这种情况,我们需要在按钮上添加防抖功能,即在用户点击按钮后的一段时间内禁用按钮,防止重复点击。

  2. 实现步骤
    2.1 创建自定义指令
    首先,我们需要在 main.js 文件中创建一个自定义指令 noMoreClick。这个指令会在按钮被点击后禁用按钮一段时间,然后再重新启用。

// main.js
import Vue from 'vue'

Vue.directive('noMoreClick', {
  inserted(el, binding) {
    el.addEventListener('click', () => {
      el.classList.add('is-disabled')
      el.disabled = true
      setTimeout(() => {
        el.disabled = false
        el.classList.remove('is-disabled')
      }, 2000) // 设置禁用时间为2秒
    })
  }
})

2.2 使用自定义指令
接下来,在需要添加防抖功能的按钮上使用 v-no-more-click 指令。例如:

<template>
  <el-form ref="ruleForm" :model="form" :rules="rules" label-width="120px">
    <!-- 表单内容 -->
    <el-form-item>
      <el-button v-no-more-click type="primary" @click="submitForm('ruleForm')">确 定</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      form: {},
      rules: {}
    }
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // 提交表单逻辑
        } else {
          console.log('表单验证失败')
          return false
        }
      })
    }
  }
}
</script>
  1. 解释
    3.1 自定义指令的生命周期
    inserted: 当指令绑定到元素后调用。在这个钩子中,我们可以为元素添加事件监听器。
    3.2 禁用按钮
    当按钮被点击时,首先添加 is-disabled 类,并将按钮的 disabled 属性设置为 true,以禁用按钮。
    使用 setTimeout 函数,在指定的时间(例如2秒)后,将按钮的 disabled 属性设置为 false,并移除 is-disabled 类,重新启用按钮。
  2. 注意事项
    时间设置: 根据实际需求调整 setTimeout 的时间,以确保用户有足够的反馈时间,同时避免按钮被禁用过长时间。
    样式调整: 可以根据需要调整 is-disabled 类的样式,以提供更好的用户体验。
  3. 总结
    通过创建一个简单的自定义指令 noMoreClick,我们可以在 Vue.js 项目中轻松地为 el-button 添加防抖功能,防止用户在短时间内多次点击提交按钮。这种方法不仅简单易用,而且可以有效地避免重复提交的问题,提升用户体验。

http://www.kler.cn/a/515913.html

相关文章:

  • dp 凸优化
  • MYSQL学习笔记(五):单行函数(字符串、数学、日期时间、条件判断、信息、加密、进制转换函数)讲解
  • Vscode配置continue运行ollama部署的Qwen2.5
  • 网络安全解决方案分享:推荐十款网络准入控制系统,保护企业网络安全
  • Unity新版InputSystem短按与长按,改键的实现
  • Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普
  • 备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示
  • Alibaba Spring Cloud 四 Seata 的核心组件:TC
  • 【浙江省乡镇界】面图层shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移内容测评
  • 在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
  • 【C++图论 并集查找】2492. 两个城市间路径的最小分数|1679
  • TOGAF之架构标准规范-信息系统架构 | 数据架构
  • 小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统
  • c语言贪吃蛇(极简版,基本能玩)
  • 【豆包MarsCode蛇年编程大作战】花样贪吃蛇
  • 操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之缓冲区的管理
  • 百度APP iOS端磁盘优化实践(上)
  • 深入理解Spring Boot:启动方式、注解、配置文件与模板引擎
  • 深度理解递归(树的深度优先遍历、费波那契数列)c++
  • Effective C++ 规则43:学习处理模板化基类内的名称
  • linux+docker+nacos+mysql部署
  • 认识Django项目模版文件——Django学习日志(二)
  • Spring Boot整合Thymeleaf、JDBC Template与MyBatis配置详解
  • 【C语言】编译链接
  • 软考信安26~大数据安全需求分析与安全保护工程
  • 【C++笔记】哈希表底层实现的深度剖析