Vue 自定义指令实现权限控制

image.png

一. 引言

Vue.js 提供了一种简单、灵活的方式来创建交互式的用户界面。在 Vue.js 中,指令是一种特殊的属性,可以附加到 HTML 元素上以执行一些操作。我们可以使用自定义指令来实现各种功能,比如:权限控制、自动聚焦、拖动指令等等。

权限控制是 Web 应用程序中的一个重要问题,尤其是细粒度的前端权限控制,比如不同的用户拥有不同的操作权限,确保只有经过身份验证的用户才能访问或操作受保护的资源。通过使用自定义指令,我们可以方便地实现权限控制功能。在本篇文章中,我们将介绍如何使用 Vue.js 实现自定义权限指令,并且利用它实现细粒度的前端权限控制。

本篇文章将涵盖以下问题:

  • 什么是自定义指令

  • 如何快速创建自定义指令

  • 了解指令的生命周期

  • 自定义指令的两种方式

  • 如何在 Vue.js 中使用自定义指令实现权限控制

二. 什么是自定义指令

自定义指令是 Vue.js 框架提供的一项强大功能,它允许开发者根据自己的需求,定义全局或局部指令,以便在 DOM 元素上添加特定的行为和功能。自定义指令的主要作用是扩展 Vue.js 框架的能力,以满足特定的业务需求。

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives)。

自定义指令可以用来操作 DOM,不仅可用于定义任何的 DOM 操作,并且是可复用的。

如何快速创建自定义指令

以定义一个最简单的自定义指令为例,需要执行以下步骤:

  1. 定义一个具有 bindupdate 函数的对象。

  2. 在 Vue 实例或全局范围内使用 Vue.directive() 方法将指令注册为全局指令。

  3. 在模板中使用自定义指令。

下面是一个简单的自定义指令示例:

Vue.directive("focus", {bind: function (el) {el.focus();},update: function (el) {el.blur();},
});

在这个例子中,我们创建了一个名为 focus 的自定义指令。当元素被绑定时,它会调用 focus() 方法,使元素获得焦点。当元素被更新时,它会调用 blur() 方法,使元素失去焦点。

三. 自定义指令的两种类型

Vue 自定义指令可以分为全局指令和局部指令两种类型。全局自定义指令和局部自定义指令。全局自定义指令可以在整个应用程序中使用,而局部自定义指令只能在特定的 Vue 实例或组件中使用。

  1. 全局指令:全局指令是在 Vue 实例化之前就被注册为全局可用的指令。通过在 Vue 实例化之前使用 Vue.directive() 方法全局注册指令。全局指令在任何组件中都可以使用,不需要显式地导入或声明。

示例:

// 全局注册自定义指令
Vue.directive("custom", {bind(el, binding) {// 指令绑定时的逻辑},// ...
});
  1. 局部指令:局部指令是在组件中局部定义和使用的指令。它只在定义了该指令的组件内部才可以使用。

示例:

<template><div><p v-custom>这是一个局部指令</p></div>
</template><script>
export default {directives: {custom: {bind(el, binding) {// 指令绑定时的逻辑},// ...},},
};
</script>

在这个示例中,v-custom 是一个局部指令,只能在当前组件内部使用。它通过在组件的 directives 选项中注册指令,并提供相应的指令钩子函数,实现了局部指令的功能。

全局指令和局部指令可以根据实际需求选择使用,全局指令适用于在多个组件中普遍使用的指令,而局部指令适用于在特定组件中使用的指令。

四. 自定义指令的生命周期

首先,要实现自定义指令,首先需要理解一个指令从创建到消亡的过程,它的生命周期包括五个阶段,如下所示:

  1. bind:只调用一次,指令第一次绑定到元素时调用。可以在这里进行一些初始化操作。

  2. inserted:被绑定的元素插入父节点时调用。可以在这里进行一些操作,比如获取元素的子节点等。

  3. update:当指令所在的组件实例化完成后,和刚创建时相比,会触发该钩子函数。可以在这里进行一些更新操作,比如获取元素的子节点等。

  4. componentUpdated:被绑定的元素所在的组件渲染完成之后调用。可以在这里进行一些操作,比如获取元素的子节点等。

  5. unbind:指令解绑时调用。可以在这里进行一些清理操作。

下面是一个简单的示例代码:

<template><div><p v-custom>这是一个自定义指令</p></div>
</template><script>export default {directives: {custom: {bind(el, binding, vnode) {console.log("bind", el, binding, vnode);},inserted(el, binding, vnode) {console.log("inserted", el, binding, vnode);},update(el, binding, vnode) {console.log("update", el, binding, vnode);},componentUpdated(el, binding, vnode) {console.log("componentUpdated", el, binding, vnode);},unbind(el, binding, vnode) {console.log("unbind", el, binding, vnode);},},},};
</script>

在这个示例中,我们定义了一个名为 v-custom 的自定义指令,并在其中实现了五个生命周期钩子函数。在模板中使用这个指令时,每次绑定、插入、更新、组件更新和解绑都会打印相应的日志信息。

image.png

五. 自定义指令实现权限控制

1. 定义权限指令

首先,我们需要定义一个自定义指令。在 Vue.js 中,指令是带有 v- 前缀的特殊属性,用于向元素添加特定的行为。我们可以使用 directive 方法来定义一个自定义指令:

Vue.directive("hasPermission", {inserted: function (el, binding) {// 获取需要检查的权限名称const permissionName = binding.value;// 判断当前用户是否拥有该权限if (!checkPermission(permissionName)) {// 如果用户没有该权限,则将其隐藏或移除元素(el.parentNode && el.parentNode.removeChild(el)) ||(el.style.display = "none");} else {// 如果用户拥有该权限,则显示元素}},
});

上述代码中,我们定义了一个名为 hasPermission 的自定义指令,当该指令被插入到元素中时,会通过 inserted 钩子函数来执行相应的逻辑。在以上的代码中,我们通过 checkPermission 方法来判断当前用户是否拥有指定的权限。如果用户没有该权限,则将其隐藏;如果用户拥有该权限,则显示元素。

注意:隐藏和移除元素虽然在展示上我们看不到有任何不同,但其实之间有质的差别。类似于 v-ifv-show,隐藏其实是控制的 display 样式,赋值为 none 或 block。而移除则直接是移除的 dom 元素,页面上将不存在这个元素。因此,对于权限控制来说,移除具有比较高的安全性!

  • 使用 el.parentNode.removeChild 移除元素的效果

record-2.gif

record-2.gif

  • 使用 el.style.display = "none" 隐藏元素的效果

record-3.gif

record-3.gif

2. 实现 checkPermission 方法

接下来,我们需要实现 checkPermission 方法,该方法用于检查当前用户是否拥有指定的权限。在这个方法中,我们可以从服务器端获取用户的权限列表,或者从本地存储中获取已存储的权限列表。这里我们假设已经从服务器端获取并存储了用户的权限列表,并将其存储在了 localStorage 中。具体实现如下:

function checkPermission(permissionName) {// 获取当前登录用户的权限列表(假设已经从服务器获取并存储在了 localStorage 中)const userPermissions =JSON.parse(localStorage.getItem("userPermissions")) || [];// 判断用户是否拥有指定的权限return userPermissions.indexOf(permissionName) !== -1;
}

上述代码中,我们首先从 localStorage 中获取已存储的用户权限列表 userPermissions。然后,我们使用 indexOf 方法来判断当前用户是否拥有指定的权限。如果该用户拥有该权限,则返回 true;否则返回 false

3. 使用权限指令

最后,我们可以在需要添加权限控制的元素的 v-hasPermission 属性上绑定需要检查的权限名称。例如:

<div><div v-hasPermission="'edit'">编辑按钮</div><div v-hasPermission="'delete'">删除按钮</div>
</div>

以上代码中,我们在需要添加编辑权限控制的编辑按钮上使用了 v-hasPermission 属性,并将其绑定到了 edit 这个权限名称上。这样,当用户点击该按钮时,就会触发 hasPermission 钩子函数,从而判断其是否有编辑权限。如果有权限,则显示按钮;否则隐藏按钮。

record-1.gif

record-1.gif

六. 总结

本文介绍了 Vue.js 中自定义指令的实现方法。通过自定义指令,我们可以控制 DOM 元素的显示和隐藏、修改元素属性等操作,从而实现更加灵活的交互效果。

通过使用自定义指令实现权限控制,我们可以更好地控制页面元素的显示和隐藏,从而提供更好的用户体验。此外,我们还可以使用自定义指令来验证用户输入的数据是否符合要求,以确保应用程序的安全性和可靠性。

在实现自定义指令时,我们需要遵循以下步骤:

1. 定义一个具有钩子函数的对象,该对象包含了指令的各种行为和逻辑。

2. 在 Vue 实例或组件中注册该指令。

3. 在 HTML 中使用该指令。

需要注意的是,在使用自定义指令时,我们需要确保在 Vue 实例或组件中传递了正确的上下文(context),以便能够正确地获取到权限列表等信息。同时,我们也需要在指令对象中定义相应的钩子函数,以实现不同的行为和逻辑。

总之,Vue.js 自定义指令是一个非常强大的功能,可以帮助我们快速构建出高效、安全和可靠的 Web 应用程序。其次通过自定义指令我们可以实现更多复杂的功能,而本篇文章所讲的权限指令属于项目中最常见且比较容易实现的,因此接下来需要我们探索去实现更多的其他指令!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过docker启动ElasticSearch后为ElasticSearch设置用户和密码

文章目录 0. 前言1. 没有设置用户名和密码的情况2. 为ElasticSearch设置用户名和密码2.1 进入 ElasticSearch 容器内部2.2 修改 ElasticSearch 的配置文件2.3 设置用户名和密码 3. 在 kibana 容器中指定访问 ElasticSearch 的用户名和密码4. 设置用户名和密码后的情况4.1 访问 …

[51单片机] 简单介绍 (一)

文章目录 1.单片机介绍2.单片机内部三大资源3.单片机最小系统4.STC89C52RC单片机 1.单片机介绍 兼容Intel的MCS-51体系架构的一系列单片机。 STC89C52&#xff1a;8K FLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源。 单片机简称MCU单片机内部集成了CPU、RAM、…

Maxim(美信)—MAX20079AATP/VY PMIC芯片详解

写在前面 本系列文章主要讲解Maxim&#xff08;美信&#xff09;—MAX20079AATP/VY PMIC芯片的相关知识&#xff0c;希望能帮助更多的同学认识和了解MAX20079AATP/VY芯片。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) PMIC是Power Management Int…

CC面试准备

半导体基础 半导体是介于导体和绝缘体之间的一种介质&#xff0c;在不同条件下表现出不同的导电性或者不导电特性&#xff0c; 电子半导体器件材料大部分为硅&#xff0c;锗等元素 本征半导体&#xff1a;完全不含杂质的纯净半导体&#xff0c;因为不含杂质&#xff0c;其中…

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略&#xff1a;扩展 Fixed (固定): 行为&#xff1a;控件的大小是固定的&#xff0c;不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景&#xff1a;当你希望控件的大小保持不变&#xff0c;不随布局调整时使用&#x…

RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验

1.RAGflow简介 全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。大语言模型 LLM 以及向量模型均支持配置。基于多路召回、融合重排序。提供易用的 API&#xff0c;可以轻松集成到各类企业系统。支持丰富的文件类型&#xff0c;包括 Word 文档、PPT、exc…

前端报错401 【已解决】

前端报错401 【已解决】 在前端开发中&#xff0c;HTTP状态码401&#xff08;Unauthorized&#xff09;是一个常见的错误&#xff0c;它表明用户试图访问受保护的资源&#xff0c;但未能提供有效的身份验证信息。这个错误不仅关乎用户体验&#xff0c;也直接关系到应用的安全性…

Uniapp时间戳转时间显示/时间格式

使用uview2 time 时间格式 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 <text class"cell-tit clamp1">{{item.create_time}} --- {{ $u.timeFormat(item.create_time, yyyy-mm-dd hh:MM:ss)}} </text>

OpenAI发布多语言MMMLU数据集;火山引擎发布AI视频生成大模型豆包

&#x1f989; AI新闻 &#x1f680; OpenAI发布多语言MMMLU数据集 摘要&#xff1a;OpenAI在Hugging Face上推出了多语言大规模多任务语言理解&#xff08;MMMLU&#xff09;数据集&#xff0c;旨在评估大型语言模型在各种语言和任务中的表现。该数据集涵盖广泛的主题与学科…

记某学校小程序漏洞挖掘

前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#xff0c;奇葩弱口令离谱进去&#xff0c;站点里面越权泄露敏感信息&#xff0c;接管账号等漏洞&#xff01;&#xff01;&#xff01; 渗透思路 1.绕过前端 …

代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树 题目 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例1&#…

[网络] 网络层--IP协议

目录 一、IP协议 1.1 基本概念 1.2 IP协议报头 1.3 如何将报头和有效载荷分离和分用 1.4 分片与组装 1.5 如何减少分片&#xff1f; 1.6 分片和封装的具体过程 二、网段划分 2.1 再次理解IP地址 2.2 了解DHCP 2.3 网络划分方案 2.4 为什么要进行网络划分 2.5 特殊的…

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么&#xff1f; 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类&#xff1a;对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

【html】基础(二)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;js专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &am…

http增删改查四种请求方式操纵数据库

注意&#xff1a;在manage.py项目入口文件中的路由配置里&#xff0c;返回响应的 return语句后面的代码不会执行&#xff0c;所以路由配置中每个模块代码要想都执行&#xff0c;不能出现return 激活虚拟环境&#xff1a;venv(我的虚拟环境名称&#xff09;\Scripts\activate …

Unity3D 小案例 像素贪吃蛇 03 蛇的碰撞

Unity3D 小案例 像素贪吃蛇 第三期 蛇的碰撞&#xff08;完结&#xff09; 像素贪吃蛇 碰撞蛇身 当蛇头碰撞到蛇身时&#xff0c;游戏应该判定为失败。 找到蛇身预制体&#xff0c;添加 Body 标签和碰撞体&#xff0c;碰撞体的大小为 0.5&#xff0c;跟蛇头和蛇身的碰撞体范…

AlDente Pro for Mac电池健康保护工具

AlDente Pro for Mac 是一款适用于 Mac 的实用电池健康保护工具。以下是它的主要特点和优势&#xff1a; 软件下载地址 一、保护电池寿命的原理 锂离子和聚合物电池&#xff08;如 Mac 笔记本中的电池&#xff09;在 30% 到 80% 之间运行时使用寿命最长。始终将电池电量保持…

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10-arm/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计&#xff0c;自行研究复现。欢迎大家交流优化实现方法~ 此次…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…