vue使用自定义指令来控制页面按钮组的权限思想

 更新时间:2022年08月15日 10:34:21   作者:A黄俊辉A  
这篇文章主要介绍了vue使用自定义指令来控制页面按钮组的权限思想,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

自定义指令来控制页面按钮组的权限思想

在vuejs中, 我们可以自定义一些指令,来控制一些按钮加载之前的动作, 比如现有的 v-if 或者 v-show

这些功能是我们可以手写的, 现在们来做一个初级的页面级的权限控制的例子

vue自定义指令

<template>
  <div class="table-wrapper">
    <div class="action-bar">
        //v-hasProm  指令是说 如果指令中value 包含在 data.promission 数组中, 就把这个按钮显示出来 
      <el-button v-has-prom="'admin.goods.edit'" type="success" icon="el-icon-plus" @click.native = "$router.push('/makeform/create')">新建</el-button>
  </div>
</template>
<script>
export default {
  name: "FromList",
  //这里添加了一个局部指令 (只作用于本面页)
  directives:{
    hasProm:{
      inserted(el,binding,vnode){
        console.log(el,binding,vnode);
        //这里要说一下 这三个参数
        // el就是 指令所在的 元素(element)   我们可以使用  el.style.dispaly='none' 来对el 的css进行设置
        //binding 是指的binding 的信息, 其中可以得到我们 v-hasProm = value 中的  value值
        //vnode 就是指的虚拟节点, 我们可以通过它, 得到当前页面中的  component.data 中的数据 也就是promission 数组长  页面的 this 在指令中是得不到了, 我们能过  vnode.context得到的就是 this
        //看一下代码
        let bindvalue = binding.value;    //bindvalue 的值是'admin.goods.edit'
        let promissionArr = vnode.context.promission;
        let p = promissionArr.find((item)=>{
            return item == bindvalue;
        })
        if(p == undefined){
            //说明在数组中没有这个权限, 把这个元素给隐藏
            el.style.display="none"
        }
        
      }
    }
  },
  data(){
    return {
        promission:["admin.goods.add","admin.goods.edit","admin.goods.delete"]
        //上面的权限更表 以字符串开式, 这个其实可以从后端获取得到, 然后放在store中, 全局可使用, 这里就写在data中算了
    }
  },
  created() {
  },
  methods:{
  }
}
</script>
<style scoped>
</style>

上面的代码, 主要要注意 自定义指令的参数, 都可以获得什么有用的数据。

vue添加按钮权限~通过自定义指令

1、需求

客户:需要把导入、删除权限化;指定人员有权限;

2、思路

后台有一个接口,是可以查询到当前登录人的权限;

前端方案:

1.每到一个页面就请求一次接口是否有权限;(太麻烦了)

2.自定义指令 · Vue.directive;(一次请求,一直用)

3、代码实现

1.自定义指令

创建 /directive/permission/hasPermi 文件

//用来获取权限数据
import store from '@/store'
 
export default {
 
  inserted(el, binding, vnode) {
    //获取绑定值
    const { value } = binding
    // TODO 匹配规则,在页面写的要对应这个匹配规则
    const all_permission = "*:*:*";
    //获取用户权限数据
    const permissions = store.getters && store.getters.permissions 
if (value && value instanceof Array && value.length > 0) { 
      //权限标志
      const permissionFlag = value
      //判断用户是否有此权限
      const hasPermissions = permissions.some(permission => {
        console.log('permission', permission);
  return all_permission === permission || permissionFlag.includes(permission)
      })
      
      //没有权限-移除页面上的控件
      if (!hasPermissions) {{
        console.log('没有权限-移除');
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else { 
      el.parentNode && el.parentNode.removeChild(el)
      throw new Error(`请设置数组操作权限`)
    }
  }
}

2.注册指令

创建 /directive/permission/index文件

import hasPermi from './hasPermi'
import Vue from "vue"
 
 
const install = function (Vue) {
  Vue.directive('hasPermi', hasPermi)
}
 
 
if (window.Vue) {
  window['hasPermi'] = hasPermi
  Vue.use(install);
}
 
export default install

3.在main.js里面进行全局注册 

import permission from './directive/permission'
 
 
Vue.use(permission)

vue官网对指令的解释

https://cn.vuejs.org/v2/guide/custom-directive.html

4.使用方法

      <button
           v-has-permi="['btn:pre:del']"
           style="margin-top: 4px"/>
 
 
   <button
           v-has-permi="['btn:pre:export']"
           style="margin-top: 4px"/>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • vue单页缓存方案分析及实现

    vue单页缓存方案分析及实现

    这篇文章主要介绍了vue单页缓存方案分析及实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 面试官问你Vue2的响应式原理该如何回答?

    面试官问你Vue2的响应式原理该如何回答?

    可能很多小伙伴之前都了解过 Vue2实现响应式的核心是利用了ES5的Object.defineProperty 但是面对面试官时如果只知道一些模糊的概念。只有深入底层了解响应式的原理,才能在关键时刻对答如流,本文就来和大家详细聊聊,感兴趣的可以收藏一下
    2022-12-12
  • 详解Nuxt.js部署及踩过的坑

    详解Nuxt.js部署及踩过的坑

    这篇文章主要介绍了详解Nuxt.js部署及踩过的坑,Nuxt.js 提供了两种发布部署应用的方式:服务端渲染应用部署 和 静态应用部署。本文主要说说服务端渲染应用部署,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Vue实现嵌套菜单组件

    Vue实现嵌套菜单组件

    这篇文章主要为大家详细介绍了Vue实现嵌套菜单组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Vue路由回退页面不刷新的原因及解决方案汇总

    Vue路由回退页面不刷新的原因及解决方案汇总

    在Vue开发过程中,常常会碰到这样一种情形:从页面A跳转到页面B后,点击浏览器回退按钮返回页面A时,页面数据却未刷新,依旧保持之前的状态,这一情况可能会给用户带来困扰,对用户体验产生不良影响,本文将深入探讨如何妥善处理此类问题,以保证回退页面时数据能够准确更新
    2024-11-11
  • Vue实现二维码数组的全选与反选功能

    Vue实现二维码数组的全选与反选功能

    在开发Web应用程序时,表格数据的展示和操作是非常常见的需求之一,特别是在处理表格中的复选框选择时,我们经常需要实现全选、反选等功能,这篇文章将带你深入了解如何在Vue.js中实现对二维数组数据的全选和反选功能,需要的朋友可以参考下
    2024-09-09
  • 用vue设计一个日历表

    用vue设计一个日历表

    这篇文章主要介绍了如何用vue设计一个日历表,帮助大家更好的理解和学习vue框架,感兴趣的朋友可以了解下
    2020-12-12
  • vue的简介及@vue/cli 脚手架的使用示例

    vue的简介及@vue/cli 脚手架的使用示例

    vue 是一个 渐进式的javascript框架,脚手架是一个通用概念,帮助搭建项目的工具,本文以vue2为例结合实例代码给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • vue directive全局自定义指令实现按钮级别权限控制的操作方法

    vue directive全局自定义指令实现按钮级别权限控制的操作方法

    这篇文章主要介绍了vue directive全局自定义指令实现按钮级别权限控制,本文结合实例代码对基本概念做了详细讲解,需要的朋友可以参考下
    2023-02-02
  • vite+vue3使用@路径报错处理

    vite+vue3使用@路径报错处理

    本文主要介绍了vite+vue3使用@路径报错处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11

最新评论