2019-10-25 vue前端按钮权限控制隐藏

vue前端按钮权限控制隐藏
权限控制描述
如何实现
1、储存权限数据
2、权限判断方法
3、设置vue自定义指令
4、最终代码与效果

很多后台管理系统会用到权限管理,菜单权限比较好控制,按钮权限就复杂一些,本文介绍的就是按钮权限如何控制,用的是vue项目。
权限控制描述
前端需要根据后端传来的权限数据控制是否显示新增、编辑、删除(红框所示部分)功能。


image.png
在这里插入图片描述

菜单管理处设置的新增、删除、编辑权限参数如图红框所示部分

image.png

如何实现
1、储存权限数据
首先将权限控制的数据储存到vuex或者sessionstorage中,或者全局变量。
如何获得权限数据并提交到vuex的博文
https://blog.csdn.net/weixin_44849078/article/details/89184039

2、权限判断方法
以新增按钮为例,因为设置的新增菜单权限参数为"line-add",所以html标签如下,v-has为vue自定义指令,line-add为储存在后台的权限参数

<el-button type="primary" v-has="'line_add'">新增</el-button>

store.getters.getMenuBtnList为储存在vuex中的菜单按钮数据,遍历对比permission字段是否与标签中的自定义参数line_add相等,匹配成功则表明有权限,失败没有权限,返回false。

    function permissionJudge(value) {
      let list = store.getters.getMenuBtnList;
      for (let item of list) {
        if (item.permission === value) {
          return true;
        }
      }
      return false;
    }

3、设置vue自定义指令
注册一个全局自定义指令并监控它

// 注册一个全局自定义指令 `v-has`
Vue.directive('has', {
  // 当被绑定的元素插入到 DOM 中时触发bind钩子
  bind: function (el, binding) {
    if (!permissionJudge(binding.value)) {
      el.parentNode.removeChild(el);
    }
  }
});

结果发现报错了,调试后发现el.parentNode为null,所以removeChild方法报错,我猜可能是因为bind钩子触发时父元素还没有生成,所以换成inserted钩子。
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

4、最终代码与效果
使用inserted后成功实现没有权限的按钮隐藏效果,代码如下

Vue.directive('has', {
  inserted: function (el, binding) {
    if (!permissionJudge(binding.value)) {
      el.parentNode.removeChild(el);
    }

    function permissionJudge(value) {
      // 此处store.getters.getMenuBtnList代表vuex中储存的按钮菜单数据
      let list = store.getters.getMenuBtnList;
      for (let item of list) {
        if (item.permission === value) {
          return true;
        }
      }
      return false;
    }
  }
});
<el-button type="primary" v-has="'line_add'">新增</el-button>
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要招一个会vue的开发者: 作为面试官的你,你还会每次都只是问这些老土的问题吗?你对MVVM的理解是什么?你知道什...
    浪子神剑阅读 23,169评论 0 260
  • 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解 你知道v-model的原理吗?说说看...
    w晚风阅读 3,758评论 4 20
  • vue是什么? vue是构建数据驱动的web界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现...
    九四年的风阅读 8,747评论 2 131
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,187评论 0 1
  • 我总是喜欢追寻发光事物,闪耀着的,比如星星、比如太阳、比如某些人, 那是我前进的方向,是我梦想的港湾。 ...
    呼啦圈要去看海阅读 374评论 0 1