vue中按钮防止暴力点击,多次提交数据的问题,组件通用化封装

news/2024/7/19 16:40:32 标签: vue, js, javascript, 组件, 暴力点击

方法1:用计时器改变按钮可点击状态

<template>
  <div class="test">
    <button @click="btnClick">button</button>
  </div>
</template>
 
 
<script>
  export default {
    name: 'HelloWorld',
    data() {
      return {
        is_click: false
      }
    },
    methods:{
      btnClick(){
        if(this.is_click){
          return false;
        }
        console.log('我是要执行的部分 每次点击执行一次');
        this.is_click=true;
        setTimeout(()=>{
          this.is_click=false;
 
        },2000)
 
      }
    }
  }
</script>


方法2,通过控制isDisable 来设置 disabled来控制按钮的点击和不可点击。 默认isDisable:的值为 false,按钮可以点击。 当我们点击这个按钮的时候,首先将按钮的绑定isDisable设置为true,1秒后立马将其置为false。 所以用户只能有一秒的时间去操作这个按钮。

<template>
  <button @click="submit()" :disabled="isDisable">点击</button>
</template>
 
<script>
  export default {
    name: 'TestButton',
    data: function () {
      return {
        isDisable: false
      }
    },
    methods: {
      submit() {
        this.isDisable = true
        setTimeout(() => {
          this.isDisable = false
        }, 1000)
      }
    },
  }
</script>


 
但是如果很多页面都有这种问题就很难操作,所以我们可以自定义组件

<template>
  <div class="clickAgain">
    <div @click="btnClick">
      <slot></slot>
 
    </div>
  </div>
 
</template>
 
<script>
  export default {
    name: "clickAgain",
    data() {
      return {}
    },
    methods: {
      btnClick() {
        if (this.is_click) {
          return false;
        }
        this.$emit("btnClick");
        this.is_click = true;
        setTimeout(() => {
          this.is_click = false;
 
        }, 2000)
 
      }
    }
  }
</script>


防止暴力点击组件

<template>
  <div class="clickAgain">
    <div @click="btnClick">
      <slot></slot>
 
    </div>
  </div>
 
</template>
 
<script>
  export default {
    name: "clickAgain",
    data() {
      return {}
    },
    methods: {
      btnClick() {
        if (this.is_click) {
          return false;
        }
        this.$emit("btnClick");
        this.is_click = true;
        setTimeout(() => {
          this.is_click = false;
 
        }, 2000)
 
      }
    }
  }
</script>


3 通过自定义指令

1)新建plugins.js

javascript">export default {
  install (Vue) {
    // 防重复点击(指令实现)
    Vue.directive('preventReClick', {
      inserted (el, binding) {
        el.addEventListener('click', () => {
          if (!el.disabled) {
            el.disabled = true
            setTimeout(() => {
              el.disabled = false
            }, binding.value || 3000)
          }
        })
      }
    })
  }
}


2)在main.js引用

3)按钮调用直接加v-preventReClick

<el-button type="prismary" style="width:100%;" @click="handleSubmit" v-preventReClick></el-button>


这样就不需要每次使用都引入对应组件只用改变点击事件的调用方法即可 


http://www.niftyadmin.cn/n/1466621.html

相关文章

js 实现 list转换成tree的方法示例(数组到树)

目标&#xff1a; JS 将有父子关系的平行数组转换成树形数据 方法&#xff1a;双重遍历&#xff0c;一次遍历parentId,一次遍历id parendId; 该方法应该能很容易被想到&#xff0c;实现起来也一步一步可以摸索出来&#xff1b; const oldData [{id:1,name:boss,parentId:…

div在body中可以任意拖动

HTML代码 <div id"idOuterDiv" class"CsOuterDiv"></div> CSS代码 body {background-color:#232429; } .CsOuterDiv {width:256px;height:146px;background-color:white;position:absolute;top:50%;left:50%;transform:translateX(-50%) tra…

在Vue中使用JSX作为render

ant-design-vue开源了一段时间后&#xff0c;收到了一些反馈&#xff0c;尤其是Form组件上线后&#xff0c;很多用户对JSX的使用感到迷惑和不习惯&#xff0c;为此专门介绍下Vue JSX的使用姿势及注意事项。 Form组件的自动收集校验功能需要在JSX下使用&#xff0c;当然如果不需…

Vue 自定义指令实现点击DOM元素以外触发事件

1.directive.js import Vue from "vue";// 提交验证Vue.directive("clickOutside", {// 初始化指令bind(el, binding, vnode) {function clickHandler(e) {// 这里判断点击的元素是否是本身&#xff0c;是本身&#xff0c;则返回if (el.contains(e.target…

Vue 实现复制功能,不需要任何结构内容直接复制方式

介绍&#xff1a; 在做复制文档功能时&#xff0c;考虑到是个不太会复用的小功能&#xff0c;最后选择直接用 document.execCommand 方法实现。 在查阅资料时候&#xff0c;发现其他人都需要在页面上写上结构、ID。然后捕捉某个ID获取内容&#xff0c;感觉很不方便。 使用&a…

css3字体背景颜色跑马灯

页面效果 CSS .title {border: 0px;font-size: 200%;font-weight: bold;float: left;line-height: 1.5;width: 100%;padding-left: 5px;margin-top:0px;background: -webkit-linear-gradient(left,#ffffff,#ff0000 6.25%,#ff7d00 12.5%,#ffff00 18.75%,#00ff00 25%,#00ffff 31.…

vue路由切换之淡入淡出的简单实现

路由跳转的淡入淡出 在开发中有一种需求叫高端、大气、上档次。所以作为一个前端有责任让你的程序开起来更酷炫。可以在页面切换时我们加入一些动画效果&#xff0c;提升我们程序的动效设计 想让路由有过渡动画&#xff0c;需要在<router-view>标签的外部添加<trans…

基于vuex的任务事项管理的小demo

基于vuex的任务管理的小demo&#xff0c;适合学习vuex&#xff0c;充分运用了vuex 程序demo页面 使用到的vuex方法总概况 大家可以自己看看&#xff0c;探讨一下&#xff0c;附git地址&#xff1a; https://github.com/erdfty/vuex-todos