Vue 自定义指令封装实现防抖 防止按钮暴力点击

本来项目前期没有做按钮防抖功能 快结束时才想起来 然后一个个写太慢了 然后就想着封装一下

vue3:新建directive.js

export default {
    //自定义节流操作
    preventReClick: {
        mounted(el, binding) {
            el.addEventListener('click', () => {
                if (!el.disabled) {
                    el.disabled = true
                    setTimeout(() => {
                        el.disabled = false
                    }, binding.value || 2000) //2000ms间隔时间
                }
            })
        }
    }
}
 

然后在全局注册指令

// 点击防抖注册
import dir from '../src/utils/directive'
const app = createApp(App);
app.directive('preventReClick', dir.preventReClick);

最后使用的时候  v-preventReClick如果不指定延迟时间 会默认为设置的2000

<el-button v-preventReClick="500" type="primary" @click="login()">登录</el-button>

vue2  用法一样 大家也可以提取出来到js封装一下 用法跟上面一样

// 防抖函数
Vue.directive('throttle', {
  bind: (el, binding) => {
    let throttleTime = binding.value; // 节流时间
    if (!throttleTime) { // 用户若不设置节流时间,则默认2s
      throttleTime = 2000;
    }
    let cbFun;
    el.addEventListener('click', event => {
      if (!cbFun) { // 第一次执行
        cbFun = setTimeout(() => {
          cbFun = null;
        }, throttleTime);
      } else {
        event && event.stopImmediatePropagation();
      }
    }, true);
  },
});

注: 这个只对饿了吗组件库的按钮类点击事件管用

如果是div一类的点击事件 用下面常用的方法把

// 表情评分防抖实现
const debouncedUpdateCount = function (id, item, num) {
    if (debounceTimeout.value) {
        clearTimeout(debounceTimeout.value);
    }
    debounceTimeout.value = setTimeout(() => {
        updateCount(id, item, num);
    }, 500); // 调整延迟时间(毫秒)
};
 
 
const updateCount = (id,item,num) =>{
        /你的逻辑
    }
 
 
 
  <div @click="debouncedUpdateCount(item.id,item,1)" :class="{ selected: item.count == 1 }">
    <img src="../../assets/icons/garid1.png" alt="">
    <span>很差1分</span>
 </div>

 

总结:简单的对按钮进行了防抖封装,希望能帮到您,如有不对的地方还望您指正出来

posted @ 2025-03-07 10:08  喆星高照  阅读(38)  评论(0)    收藏  举报