• VUE封装-自定义权限控制指令


            在实际开发中,会遇到很多的权限控制、资源位的场景,其实就是用来控制某个组件的展示与否,可以是一个按钮、一个报表、一个TAB页面等

    例如下图,我想通过当前登录的用户控制谷歌的这个logo显示与否

            因为设计到的权限、资源位控制比较多,如果单纯的使用v-if 进行组件的展示与否的判断,会导致在每个页面都需要重新写,重新从vuex或者pinia或者发起请求获取资源为列表,再通过当前用户判断是否有权限。

    这就导致了两个问题:

            1)代码冗余,难于维护

            2)v-if中条件过多容易逻辑混乱

            所以我们就可以通过自定义的指令进行控制,所谓自定义指令,其实就是写一个类似v-if的属性,通过我们自定义的逻辑判断达到组件展示与否的功能

    首先再src下新建名为directive的文件夹,新建如下两个js文件

    permission.js文件:

    1. import {useSubscriber} from "@/store/index.js";
    2. /**
    3. * 权限控制指令
    4. */
    5. export default {
    6. mounted(el,binding){
    7. // 首先判断是否使用自定义指令 若不使用(无值)则不进行校验
    8. if(binding.value){
    9. // 获取pinia中的用户信息
    10. const subscriber = useSubscriber()
    11. // 从用户信息中获取其包含的权限列表
    12. const perms = subscriber.perms
    13. // 判断权限列表中是否包含自定义指令输入的值
    14. const flag = binding.value.some((item) => {
    15. return perms.indexOf(item) > -1
    16. })
    17. // 如果不包含的话 则代表无权限,则删除该节点
    18. if(!flag){
    19. el.parentNode && el.parentNode.removeChild(el)
    20. }
    21. }
    22. }
    23. }

    index.js文件:

    1. import permission from "./permission"
    2. const directives = {
    3. permission
    4. }
    5. // 注册指令
    6. export default {
    7. install(Vue){
    8. Object.keys(directives).forEach(key=>{
    9. Vue.directive(key,directives[key])
    10. })
    11. }
    12. }

    然后我们再main.js中增加

    1. import directive from "./directive/index.js";
    2. app.use(router)
    3. .use(store)
    4. // 挂到app上
    5. .use(directive)
    6. .use(components).mount('#app')

    然后就可以需要使用的页面上通过v-permission="['']"使用了

    我在网上看到些方法,里面写的是将该节点的display属性置为none,但是这样的话就会导致更改页面源码,将该组件再展示出来,所以建议还是直接删除节点。

  • 相关阅读:
    Netty实战(五)
    fast lio 2 保存每一帧的点云PCD和里程计矩阵 Odom 在txt文件
    Ubuntu 出现 Failed to Fetch的解决办法
    Spring学习(2) Spring的IOC底层实现
    5款免费BI数据可视化工具,2023年最新精选推荐!
    一张图系列 - “position_embedding”
    安卓手机使用油猴脚本教程
    《六》BFC
    ES6的内置对象扩展
    数据库多表查询 联合查询 增删改查
  • 原文地址:https://blog.csdn.net/layonly/article/details/139402930