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 3 中通过自定义指令实现按钮权限控制Vue 3 应用程序中,可以利用自定义指令来管理组件级别的访问权限。这不仅提高了代码的可维护性和重用性,还简化了视图层面上的安全机制。 #### 创建全局自定义指令 `v-permission` 为了使该功能适用于整个应用程序中的任何地方,在项目启动文件(通常是 main.js 或 app.js)里注册一个名为 `v-permission` 的全局指令: ```javascript import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; const app = createApp(App) app.directive(&#39;permission&#39;, { mounted(el, binding) { const { value } = binding; let hasPermission = false; // 获取用户的权限列表或其他验证方式 const userPermissions = getUserPermissions(); if (Array.isArray(value)) { hasPermission = value.some(permission => userPermissions.includes(permission)); } else { hasPermission = userPermissions.includes(value); } if (!hasPermission) el.parentNode && el.parentNode.removeChild(el); // 如果没有权限,则移除DOM节点 } }); function getUserPermissions() { // 这里应该返回实际获取到的用户权限数据 return [&#39;admin&#39;, &#39;editor&#39;]; // 示例假定的数据 } app.mount(&#39;#app&#39;) ``` 此段代码展示了如何创建并应用了一个叫做 `v-permission` 的自定义指令[^1]。当页面加载完成之后,它会检查当前登录用户是否有足够的权限查看特定元素;如果没有相应权限的话就会自动隐藏这些受保护的内容。 #### 使用场景实例化说明 假设存在如下 HTML 结构用于展示不同角色可见的操作按钮: ```html <button v-permission="&#39;admin&#39;" type="button">管理员操作</button> <button v-permission="[&#39;admin&#39;,&#39;editor&#39;]" type="button">编辑者及以上等级可见</button> ``` 上述模板片段表明只有具备 `&#39;admin&#39;` 角色标签的用户才能看到第一个按钮,而第二个按钮则允许拥有 `&#39;admin&#39;` 或 `&#39;editor&#39;` 身份的人点击[^2]。 这种做法使得前端开发人员能够轻松地将复杂的业务逻辑抽象成简单易懂的小部件,并且可以在不影响其他部分的情况下单独测试和部署它们。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值