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>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值