• 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,但是这样的话就会导致更改页面源码,将该组件再展示出来,所以建议还是直接删除节点。

  • 相关阅读:
    C# 学习之路(类型、存储和变量)
    「python」关于sympy的使用笔记
    立体式校验保护,让你的系统避免 90% 以上的 bug
    Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)
    使用 HelpLook Chatbot,让AI聊天机器人变成销售经理
    关于CAS等原子操作,说点别人没说的
    金山云:基于 JuiceFS 的 Elasticsearch 温冷热数据管理实践
    Apache网页优化
    xss挑战之旅11-19关
    方舟生存进化下载服务器文件及搜服方法
  • 原文地址:https://blog.csdn.net/layonly/article/details/139402930