vue3 自定义指令-按钮防连击

除了核心功能默认的内置指令(例如v-model,v-if,v-show),vue也允许注册自定义指令。初次使用vue3,相对于vue2的小差异难免有些小不适应。针对于项目中需要的按钮防连击自定义了一个指定。记录一下~

首先我们需要了解的是vue2跟vue3中钩子函数的不同

2.x语法
bind - 指令绑定到元素后发生。只发生一次。
inserted - 元素插入父 DOM 后发生。
update - 当元素更新,但子元素尚未更新时,将调用此钩子。
componentUpdated - 一旦组件和子级被更新,就会调用这个钩子。
unbind - 一旦指令被移除,就会调用这个钩子。也只调用一次。
3.x语法
created - 新的!在元素的 attribute 或事件侦听器应用之前调用。
bind → beforeMount
inserted → mounted
beforeUpdate:新的!这是在元素本身更新之前调用的,很像组件生命周期钩子。
update → 移除!有太多的相似之处要更新,所以这是多余的,请改用 updated。
componentUpdated → updated
beforeUnmount:新的!与组件生命周期钩子类似,它将在卸载元素之前调用。
unbind -> unmounted

知道了这些以后,我们就可以根据自己的需求来自定义指令了

以下是我的需求:

  1. 在标签是直接引入就可以使用,例如<el-button v-dbClick>按钮</el-button>,点击这个按钮的时候能够禁用2秒
// 防连击 double click
app.directive('dbClick', {
    mounted(el) {
        el.addEventListener('click', (e: any) => {
            el.disabled = true;
            el.style.cursor = 'not-allowed';
            setTimeout(() => {
                el.disabled = false;
                el.style.cursor = 'pointer';
            }, 2000); // 禁用两秒
        });
    }
});

// 使用
<el-button v-dbClick>按钮</el-button>
  1. 最好可以自定义禁用时间,如果不写就禁用2秒
// 防连击 double click
// 接收参数number
app.directive('dbClick', {
    mounted(el, binding) {
        el.addEventListener('click', (e: any) => {
            const timer = binding.value || 2000; //默认2秒
            el.disabled = true;
            el.style.cursor = 'not-allowed';
            setTimeout(() => {
                el.disabled = false;
                el.style.cursor = 'pointer';
            }, timer);
        });
    }
});

// 使用
<el-button v-dbClick>按钮</el-button> //默认禁用两秒
<el-button v-dbClick='1500'>按钮</el-button> // 禁用1.5秒

以上代码可直接copy,如果问题联系我!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,可以通过自定义指令来实现按钮权限控制。下面是一个简单的示例: 首先,创建一个自定义指令文件(例如`permission.js`): ```javascript import { Directive } from 'vue'; const permissionDirective: Directive = { mounted(el, binding) { const { value } = binding; // 根据用户的权限进行判断 if (!checkPermission(value)) { el.style.display = 'none'; } }, }; export default permissionDirective; ``` 在上述代码中,我们定义了一个`permissionDirective`指令,在`mounted`钩子函数中根据用户的权限(这里使用`checkPermission`函数作为示例)来判断是否显示按钮。如果权限不满足条件,则将按钮的`display`属性设置为`none`,从而隐藏按钮。 接下来,在Vue组件中使用自定义指令: ```vue <template> <button v-permission="'button.permission'">按钮</button> </template> <script> import { defineComponent } from 'vue'; import permissionDirective from './permission'; export default defineComponent({ directives: { permission: permissionDirective, }, }); </script> ``` 在上述代码中,我们通过`v-permission`指令绑定了一个权限值(例如`'button.permission'`)。当组件渲染时,自定义指令会根据权限值进行判断,并控制按钮的显隐。 需要注意的是,上述代码中的`checkPermission`函数需要根据实际业务逻辑进行实现,用于判断用户是否具有相应的权限。 这是一个简单的示例,你可以根据自己的需求进行修改和扩展以满足具体的按钮权限控制需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值