本来项目前期没有做按钮防抖功能 快结束时才想起来 然后一个个写太慢了 然后就想着封装一下
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) =>{
- /你的逻辑
- }
-
-
-
-
- <img src="https://www.cnblogs.com/../../assets/icons/garid1.png" alt="">
- <span>很差1分</span>
-
复制代码
总结:简单的对按钮进行了防抖封装,希望能帮到您,如有不对的地方还望您指正出来
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |