vue 自定义指令 权限指令

这篇博客介绍了如何在Vue项目中创建自定义指令`v-permission`,用于实现按钮级别的权限控制。通过在组件上应用指令,根据用户权限动态显示或隐藏内容。在permission.js中定义了指令逻辑,读取用户权限并对比预设的权限列表,如果用户没有相应权限,则隐藏相关元素。该方法适用于不同权限角色的页面元素展示控制。

目前项目中需要做到按钮级别的控制,所以想到了自定义指令来实现,在自定义指令中来控制组件的显示于隐藏。

1.第一步创建自定义指令 js 文件: permission.js

2.在main.js中直接引入 import '@.../../permission' 文件 

// permission.js
import Vue from "vue"
// 立即执行函数,这样可以在mian函数直接引入文件不需要写而外的代码
(function(){
  Vue.directive("permission",{
    inserted:function(el,binding){
      // 获取用户权限 [每个人存放用户权限的位置不一致,需要根据自己的业务进行相应的修改]
      let user_permissions = localStorage.getItem('permissions') || [];

      // 获取指令中配置的权限
      let permissions = [];
      var type = Object.prototype.toString.call(binding.value);
      switch(type){
        case '[object Array]':
          permissions = binding.value;
          break;
        case '[object Number]':
          permissions.push(binding.value);
          break;
        default:
          permissions = binding.value.split('|');
          break;
      }
      
      // 配置默认 admin 可以范围所有,这里可以结合你的业务进行调整  
      permissions.push('admin'); 

      // 默认不隐藏
      let flag = false;
      if(user_permissions.length == 0) flag = true;
      else {
        console.log([...new Set(permissions)]);
        console.log(user_permissions);
        if(user_permissions.length == 0)
          flag = true;
        else {
          flag = [...new Set(permissions)].filter(item => user_permissions.indexOf(item) >= 0 ).length > 0;
        }        
      }
       
      // 用户权限不足则隐藏
      if(!flag)
        el.parentNode && el.parentNode.removeChild(el);
    }
  });
})();

// main.js 直接引入不需要做其他操作
import '../.../directives/permission'

// 组件中使用
<div v-permission="'admin|user'">Welcome</div>
或者
<div v-permission="['admin','user']">Welcome</div>

### Vue.js 自定义指令实现权限管理 #### 创建自定义指令用于权限控制 为了在 Vue 应用程序中实施权限控制,可以通过创建自定义指令来动态决定组件或元素是否应渲染。这不仅简化了模板逻辑,还提高了代码的可维护性和重用性。 对于简单的场景,可以直接通过 `Vue.directive` 注册全局指令[^1]: ```javascript // 定义一个名为 hasPerm 的全局指令 Vue.directive('has-perm', { inserted(el, binding, vnode) { const { value } = binding; // 获取当前用户的权限列表或其他验证方式 let permissions = getCurrentUserPermissions(); if (!permissions.includes(value)) { el.parentNode && el.parentNode.removeChild(el); } }, }); ``` 上述代码展示了如何利用 `inserted` 钩子函数,在 DOM 节点被插入文档之后立即执行特定的操作——这里是指检查用户是否有足够的权限查看此节点;如果没有,则移除该节点。 #### 使用插件模式封装更复杂的权限逻辑 当项目规模增大时,建议采用插件形式组织权限相关的自定义指令,以便更好地管理和扩展功能。下面是一个基于插件的方式实现角色级别的权限控制的例子[^3]: ```javascript import Vue from 'vue'; const HasRoleDirective = { install(Vue, options) { Vue.directive('has-role', { bind(el, binding) { const requiredRoles = Array.isArray(binding.value) ? binding.value : [binding.value]; const userRoles = getUserRoles(); // 假设这是一个获取用户角色的方法 if (requiredRoles.some(role => !userRoles.includes(role))) { el.style.display = 'none'; } }, }); }, }; export default HasRoleDirective; // main.js 或入口文件里引入并安装插件 import HasRoleDirective from './path/to/HasRoleDirective'; Vue.use(HasRoleDirective); ``` 这种方式允许开发者轻松地在整个应用程序范围内应用一致的行为,并且可以根据需求调整内部的具体实现细节。 #### 结合Vuex状态管理模式优化性能 考虑到大型单页面应用(SPA),频繁访问服务器查询用户信息可能会影响用户体验。因此推荐结合 Vuex 存储库保存已认证的信息,减少不必要的网络请求次数。这样可以在每次触发指令钩子之前先尝试从本地缓存读取数据,只有必要时才发起新的 API 请求更新最新状态[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值