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>

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

如果是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>
相关推荐
也无晴也无风雨23 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational2 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤5 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui