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

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

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

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

这就导致了两个问题:

        1)代码冗余,难于维护

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

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

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

permission.js文件:

import {useSubscriber} from "@/store/index.js";

/**
 * 权限控制指令
 */
export default {
  mounted(el,binding){
    // 首先判断是否使用自定义指令 若不使用(无值)则不进行校验
    if(binding.value){
      // 获取pinia中的用户信息
      const subscriber = useSubscriber()
      // 从用户信息中获取其包含的权限列表
      const perms = subscriber.perms
      // 判断权限列表中是否包含自定义指令输入的值
      const flag = binding.value.some((item) => {
         return perms.indexOf(item) > -1
      })
      // 如果不包含的话 则代表无权限,则删除该节点
      if(!flag){
          el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
}

index.js文件:

import permission from "./permission"
const directives = {
  permission
}
// 注册指令
export default {
  install(Vue){
    Object.keys(directives).forEach(key=>{
        Vue.directive(key,directives[key])
    })
  }
}

然后我们再main.js中增加

import directive from "./directive/index.js";


app.use(router)
        .use(store)
        // 挂到app上
        .use(directive)
        .use(components).mount('#app')

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674967.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图片中线段和圆圈检测(python opencv)

前言 本文实现将一个图片中的线段和圆圈检测出来,效果就像这样 开始之前请先自行安装 opencv 另外还用到了一个用来检测直线: http://olena.pages.lre.epita.fr/pylena/index.html pip install pylena直线检测 先用 opencv 来检测直线, 因为下面代码…

天融信 2023 的年终奖。。

天融信 过去几天,最大的瓜,是天融信 2023 的年终奖脚踝砍。 "天融信"是国内首家网络安全企业,同时也是一家上市公司。 就在前些天,有网友爆料出,天融信年终奖到账只有几百元,甚至只有几十元&…

铝包木门窗性能优异 国内产量及需求量总体呈增长态势

铝包木门窗性能优异 国内产量及需求量总体呈增长态势 铝包木门窗是在保留纯实木门窗特性和功能的前提下,将隔热断桥铝合金型材和实木通过机械方法复合而成的框体。铝包木门窗具有良好的密封性、保温性、抗腐蚀性、隔音性等,能够满足市场对门窗质量要求不…

【Linux-阻塞,非阻塞,异步】

Linux-阻塞,非阻塞,异步 ■ Linux-阻塞-非阻塞 IO-异步■ Linux-阻塞IO■ 阻塞IO简介■ open■ 等待队列■ 示例一:APP阻塞IO读取进入睡眠后-等待队列唤醒进程■■ ■ Linux-非阻塞IO■ 非阻塞IO简介■ open■ 轮询■ 1、select 函数■ 2、po…

【轻触按键】开关机电路--填坑1

接上文,挖的坑 一、翻转电路 二、真值表 按键按下去,1G17会拉低,A端脚会掉电,下降沿;终到逻辑“0” 松开按键,1G17会拉高,A端脚充电,上升沿;终到逻辑“1”; …

[补题记录]LeetCode 6.Z字形变换

传送门:Z字形变换 转自:Z字形变换 Thought/思路 关键点在于,最后的答案是一行行连接起来的。 这样我们就会发现,这个 Z 字,实际上会让行数 不断加 1,然后又 不断减 1。每次按顺序选择 S 中的一个字符即…

visual studio打包qt算子时,只生成dll没有生成lib等文件

问题:在visual studio配置了qt项目,并打包成dll,原则上会生成一堆文件,包括dll,lib等文件。 解决办法: 挨个右击源代码的所有头文件-》属性-》项类型。改成qt头文件形式,如下。

961题库 北航计算机 计算机网络 附答案 简答题形式

有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 某网络拓扑如题下图所示,其中 R 为路由器,主机 H1~H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机…

C#中使用Mapster

Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射。 多个映射框架的性能对比: 第一步安装Mapster 使用方法 public class Test {public string name { get; set; }public string sex { get; set; }public string…

光伏并网逆变器UL 1741:2021标准解析

光伏并网逆变器UL 1741:2021标准解析 不同国家的安规认证可以说是光伏逆变器走向国际市场的一张通行证,由于全球各国家的电网制式及并网政策的不同差异,这对逆变器测试顺利的通过安规测试认证 还是有一定的技术难度,也是中国光伏制造企业迫切…

在Linux中tomcat占用内存过高可以通过导出hprof日志来解决

自动导出hprof日志 第一种方法: Tomcat的hprof日志是一种用于分析Java堆内存使用情况的工具,它可以帮助开发人员找到内存泄漏的原因。 hprof日志可以在特定的时间点对Java堆内存进行快照,并生成详细的分析报告。 启用hprof日志导出的具体…

零基础写框架:从零设计一个模块化和自动服务注册框架

模块化和自动服务注册 基于 ASP.NET Core 开发的 Web 框架中,最著名的是 ABP,ABP 主要特点之一开发不同项目(程序集)时,在每个项目中创建一个模块类,程序加载每个程序集中,扫描出所有的模块类,然后通过模块…

“去员工化”这个潮流谁也挡不住,六大诱因分析。

去员工化→恐怕是未来工作的主流,一方面有成本的原因,另一方面也有技术进步、雇佣形式创新等原因,这个潮流有利也有弊,关键看我们是如何兴利除弊。 "去员工化"是指企业在运营中减少或取消传统雇佣制度,更多…

HOW - vscode 使用指南

目录 一、基本介绍1. 安装 VS Code2. 界面介绍3. 扩展和插件4. 设置和自定义 二、常用界面功能和快捷操作(重点)常用界面功能快捷操作 三、资源和支持 Visual Studio Code(VS Code)是一款由微软开发的免费、开源的代码编辑器&…

vue开发网站-使用插件element、vant 遇到的问题

1. js把两个字符串放进一个另字符串里,用逗号分隔 let string1 "Hello"; let string2 "World"; let result ${string1},${string2}; console.log(result); // 输出: Hello,World2.js将字符串转为数组 const str "Hello, world!"…

HBuilder中怎样修改每次输出的内容hello?每次修改之后再次“运行到”的时候,怎样保证每次都重新编译?

要修改每次输出的内容,可以在代码中找到输出的地方,并将内容进行修改。例如,在JavaScript中,可以使用console.log()函数输出内容。在修改内容后,保存代码。 为了保证每次运行都重新编译代码,可以按照以下步…

LeetCode 算法:接雨水c++

原题链接🔗:接雨水 难度:困难⭐️⭐️⭐️ 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,…

使用 WM_WINDOWPOSCHANGING 跟踪窗口状态变化

在窗口位置变化过程的早期,系统会发送 WM_WINDOWPOSCHANGING 消息。 这个和 WM_WINDOWPOSCHANGED 消息不同,WM_WINDOWPOSCHANGED 消息发生在窗口位置变化之后。 一个关键的区别(除了时间之外)是,您可以通过处理 WM_WI…

OpenStreetMap部署(OSM)

参考:https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系统建议使用 Ubuntu 22 版本 安装 Docker # 更新软件包索引: sudo apt-get update # 允许APT使用HTTPS: sudo apt-get inst…

艰难求生的转型之路

起因 我个人“工作水平低,专业能力差。”是最核心的困难。 在坚持了快十年之后,博客从2015-2024。 2015201620172018201920202021202220232024 从2020年之后就已经开始全面转型之路。 所有传统赛道,都挤满了人,各种限制各种约…