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>
总结:简单的对按钮进行了防抖封装,希望能帮到您,如有不对的地方还望您指正出来
本文来自博客园,作者:喆星高照,转载请注明原文链接:https://www.cnblogs.com/houxianzhou/p/18757053