自定义指令实现vue项目中的按钮级权限

vue项目中通过自定义指令实现按钮的显示/隐藏,按钮角色是保存在vuex中的(正常是通过登陆接口返回塞进去的)。

import Vue from 'vue'
import store from './store'
import route from './router'
const customDirective = () => {
  // 注册一个全局自定义指令 `v-focus`,默认focus
  Vue.directive('focus', {
    inserted: function (el) {
      el.focus()
    }
  });
  // 控制按钮显示和隐藏
  Vue.directive('has', {
    // 当被绑定的元素插入到 DOM 中时……
    inserted: function (el, binding: any, vnode: any) {
      const roleFunction: string = (store.state as any).common.roleFunction;
      let rolePromissions: Array<any> = [];
      if (roleFunction) {
        rolePromissions = JSON.parse(roleFunction);
      }
      // let btnPermissions: Array<any> = vnode.context.$route.meta.btnPermissions || [];
      let btnPermissions: Array<any> = [];
      // 递归遍历router数据获取最新的meta...原因在于切换用户后虚拟节点依旧是老的节点
      const resusion: Function = (data: Array<any>, currentRoute: string) => {
        data.forEach(item => {
          const path: string = item.path;
          if (path === currentRoute) {
            const meta: any = item.meta;
            btnPermissions = meta.btnPermissions || [];
          } else {
            const children: Array<any> = item.children;
            if (children && children.length > 0) {
              resusion(children);
            }
          }
        })
      }
      resusion((route as any).options.routes, vnode.context.$route.path);

      const unionPromissions: Array<any> = Array.from(new Set(rolePromissions.map(item => {
        return item.btnName
      }).concat((btnPermissions as Array<any>).map(item => {
        return item.btnName;
      }))));
      const currentBtnValue: string = binding.value;
      if (unionPromissions.length > 0 && currentBtnValue !== 'btn_undefined') {
        if (unionPromissions && unionPromissions.indexOf(currentBtnValue) < 0) {
          // 开发过程中去掉这里todo
          (el as any).parentNode.removeChild(el);
        }
      }
    }
  })
};
export default customDirective

Vue.use(customDirective)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值