• vue按钮防暴力点击


    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 自定义组件 将页面中的代码抽离出来 按钮部分用slot 插入

    <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 通过自定义指令

    <template>
      <div class="login">
        <div class="inp">
         
          <p>
            <Button v-clickAgain="goLogin" style=" 100%" size="large" type="primary"> 登 录</Button>
          </p>
        </div>
      </div>
    
    </template>
    
    <script>
      import request from '../_common/Request.class'
      export default {
        name: "login",
        data() {
          return {
          }
        },
        directives: {
          'clickAgain': {
            // 指令的定义
            bind(el, binding, vnode, oldVnode) {
              // 绑定this
              let self = vnode.context;
    
              console.log(el, binding, vnode, oldVnode);
              el.onclick = function (e) {
                if (self._is_click) {
                  return false;
                }
                /*执行指令绑定的事件*/
                self[binding.expression]()
                self._is_click=true;
    
                setTimeout(()=>{
                  self._is_click=false;
                },2000)
    
               };
            }
          }
        },
        methods: {
          goLogin() {
            request.loginAction(this.params)
              .then(res => {
                console.log(res)
    
              })
              .catch(res => {
                this.time = new Date().getTime();
              })
    
    
          }
        }
      }
    </script>

    这样就不需要每次使用都引入对应组件只用改变点击事件的调用方法即可 可注册全拒绝自定义组件

  • 相关阅读:
    NGUI 3.5课程(五岁以下儿童)button-图片切换
    跑openstack命令错误【You must provide a username via either -...】
    angular cors跨域资源共享设置 和formdata设定
    PHP 如何获取客户端ip地址
    JavaScript如何生成思维导图(mindmap)
    百度ueditor上传图片时如何设置默认宽高度
    英语发音规则---E字母常见的发音组合有哪些
    google搜索引擎爬虫爬网站原理
    legend2---开发日志10(ajax请求的方法是否同样会执行base控制器里面的方法)
    JS中如何判断对象是对象还是数组
  • 原文地址:https://www.cnblogs.com/aqigogogo/p/11149771.html
Copyright © 2020-2023  润新知