按钮防抖

98 阅读1分钟

一、通过指令

directive/noMoreClick.js

import Vue from 'vue'
Vue.directive('noMoreClick', {
  inserted(el, binding) {
    el.addEventListener('click', e => {
      el.classList.add('is-disabled')
      el.disabled = true
      setTimeout(() => {
        el.disabled = false
        el.classList.remove('is-disabled')
      }, 2000)
    })
  }
})

main.js

import './directive/noMoreClick'

使用:

  <div @click="divClick">
    <el-button v-no-more-click @click="btnClick">防抖按钮</el-button>
  </div>
  
  
  methods: {
    btnClick(){
      console.log('btnClick')
    },
    divClick() {
      console.log("divClick");
    },
  },

效果:

动画.gif

二、封装DebounceButton组件

components/DebounceButton/index.vue

<template>
  <el-button @click="handleClick" v-bind="$attrs">
    <slot />
  </el-button>
</template>
<script>
// import debounce from "lodash/debounce";
function debounce(cb, delay) {
  var timer = null;
  return function () {
    if (timer) clearTimeout(timer);
    var _this = this;
    var _arguments = arguments;
    timer = setTimeout(function () {
      cb.apply(_this, _arguments);
    }, delay);
  };
}

export default {
  name: "DebounceButton",
  data() {
    const debounceClick = debounce((event) => {
      this.$emit("click", event);
    }, 500);
    return { debounceClick };
  },
  methods: {
    handleClick(event) {
      this.debounceClick(event);
    },
  },
};
</script>

main.js

import DebounceButton from '@/components/DebounceButton'


Vue.component(DebounceButton.name, DebounceButton)

使用:

  <div @click="divClick">
    <DebounceButton @click="btnClick" type="primary">防抖按钮</DebounceButton>
  </div>
  
  
  methods: {
    btnClick(){
      console.log('btnClick')
    },
    divClick() {
      console.log("divClick");
    },
  },

效果:

动画.gif