Vue3如何自定义指令directive(如权限控制)

 更新时间:2024年12月26日 14:48:51   作者:张小伟i  
本文详细介绍了如何在Vue3项目中创建自定义指令directive1,首先,在src/directives/index.ts文件中引入自定义指令,然后,创建src/directives/permission.ts文件来定义具体指令逻辑,在main.ts文件中引入并注册该指令,最后,在页面中使用自定义指令

Vue3自定义指令directive

1.创建src/directives/index.ts文件

//@ts-nocheck
import { Directive } from "vue";
import { permission } from "@/directives/permission.ts";

const allGlobalDirectives = { permission };
// console.log(allGlobalDirectives, "allGlobalDirectives"); //打印发现是导出的自定义指令名,permission
export default {
  install(app) {
    Object.keys(allGlobalDirectives).forEach(key => {  //Object.keys() 返回一个数组,值是所有可遍历属性的key名
      app.directive(key, (allGlobalDirectives as { [key: string]: Directive })[key]);  //key是自定义指令名字;后面应该是自定义指令的值,值类型是string
    });
  }
};

2.创建src/directives/permission.ts文件

import type { DirectiveBinding } from 'vue'

export const permission = (el: HTMLElement, binding: DirectiveBinding) => {
  // value 获取用户使用自定义指令绑定的内容
  const {value} = binding;
  // 获取用户所有的权限按钮
  // const permissionBtn = sessionStorage.getItem("permission");
  const permissionBtn = ["user.add23"];
  // 判断用户使用自定义指令,是否使用正确了
  if (value && value instanceof Array && value.length > 0) {
    const permissionFunc = value;
    //判断传递进来的按钮权限,用户是否拥有
    //Array.some(), 数组中有一个结果是true返回true,剩下的元素不会再检测
    const hasPermission = permissionBtn.some((role: any) => {
      return permissionFunc.includes(role);
    });
    console.log("hasPermission", value, hasPermission);
    // 当用户没有这个按钮权限时,设置隐藏这个按钮
    if (!hasPermission) {
      el.style.display = "none";
    }
  } else {
    throw new Error("need roles! Like v-permission=\"['admin','editor']\"");
  }
};

3.main.ts引入

// 引入自定义插件对象:注册全局组件
import globalDirectives from "@/directives/index.ts";

const app = createApp(App);


// 安装自定义指令
app.use(globalDirectives);
app.mount("#app");

4.页面中使用

<span v-permission="['user.add']" class="padding-right-20">测试</span>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解如何创建并发布一个 vue 组件

    详解如何创建并发布一个 vue 组件

    这篇文章主要介绍了详解如何创建并发布一个vue组件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Vue程序化的事件监听器(实例方案详解)

    Vue程序化的事件监听器(实例方案详解)

    本文通过两种方案给大家介绍了Vue程序化的事件监听器,每种方案通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2020-01-01
  • Vue中v-show添加表达式的问题(判断是否显示)

    Vue中v-show添加表达式的问题(判断是否显示)

    这篇文章主要介绍了关于Vue中v-show中添加表达式用于判断是否显示的问题,很多朋友经常会遇到这样的需求,有数据来源和标签类型两行选项,需要实现点击上面的某个数据来源时,标签类型自动切换功能,感兴趣的朋友一起看看吧
    2018-03-03
  • ant design vue datepicker日期选择器中文化操作

    ant design vue datepicker日期选择器中文化操作

    这篇文章主要介绍了ant design vue datepicker日期选择器中文化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue之el-select结合v-if动态控制template显示隐藏方式

    Vue之el-select结合v-if动态控制template显示隐藏方式

    这篇文章主要介绍了Vue之el-select结合v-if动态控制template显示隐藏方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue使用axios实现文件上传进度的实时更新详解

    vue使用axios实现文件上传进度的实时更新详解

    最近在学习axios,然后项目就用到了,所以这篇文章主要给大家介绍了关于vue中利用axios实现文件上传进度的实时更新的相关资料,文中先对axios进行了简单的介绍,方法大家理解学习,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • 基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化过程

    基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化过程

    在进行非完全标准化数据的可视化展示时,瀑布流是一种经常被采用的展示方法,瀑布流能够有效地将不同大小规格的内容以一种相对规整的方式呈现出来,本文给大家介绍了基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块,需要的朋友可以参考下
    2025-03-03
  • vue backtop组件的实现完整代码

    vue backtop组件的实现完整代码

    这篇文章主要介绍了vue backtop组件的实现完整代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Vue按照顺序实现多级弹窗效果 附Demo

    Vue按照顺序实现多级弹窗效果 附Demo

    这篇文章主要介绍了Vue按照顺序实现多级弹窗效果 附Demo,通过实例代码介绍了单个弹窗和多级弹窗的实现方法,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • vue前端测试开发watch监听data的数据变化

    vue前端测试开发watch监听data的数据变化

    这篇文章主要为大家介绍了vue测试开发watch监听data的数据变化,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论