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.xdnf.cn/news/150829.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

网安加·百家讲坛 | 刘寅:人工智能(AI)是解决软件工程问题的“银子弹”吗?

作者简介&#xff1a;刘寅&#xff0c;东南大学电子工程系本、硕&#xff0c;南京大学EMBA&#xff0c;PMP&#xff0c;前科大讯飞技术副总经理&#xff0c;曾就职于中兴通讯、摩托罗拉、趋势科技、初速度等国内、国际名企&#xff0c;多次负责过质量体系从0到1的搭建&#xff…

【研赛A题成品论文】24华为杯数学建模研赛A题成品论文+可运行代码丨免费分享

2024华为杯研究生数学建模竞赛A题精品成品论文已出&#xff01; A题 风电场有功功率优化分配 一、问题分析 A题是一道工程建模与优化类问题&#xff0c;其目的是根据题目所给的附件数据资料分析风机主轴及塔架疲劳损伤程度&#xff0c;以及建立优化模型求解最优有功功率分配…

「JVS更新日志」智能BI、低代码、逻辑引擎9.25功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

【C++掌中宝】用最少的话让你全方位理解内联函数

文章目录 引言1. 什么是内联函数2. 工作原理3. 内联函数的编程风格4. 使用限制5. 内联函数与宏的比较6. 优缺点7. 何时使用内联函数8. 补充9. 总结结语 引言 在C编程中&#xff0c;函数的调用开销是程序运行效率的一个重要影响因素。为了解决频繁调用函数时的性能问题&#xf…

人工智能助力阿尔茨海默症治疗:微软与上海精神卫生中心的新研究

最近&#xff0c;微软研究院与上海市精神卫生中心合作&#xff0c;基于微软 Azure OpenAI 服务中的多模态大模型&#xff0c;开发了一种名为“忆我”&#xff08;ReMe&#xff09;的个性化认知训练框架。这一创新项目旨在通过数字化手段扩展自动化认知训练的范围&#xff0c;为…

如何瞬间建造一个百亿商品的网上商城?借助API,无需逐个上传商品数据,自动对接电商平台百亿商品数据

在快速发展的电商时代&#xff0c;构建一个拥有百亿级商品数据的网上商城曾是许多企业遥不可及的梦想。然而&#xff0c;随着技术的不断进步&#xff0c;特别是电商平台API接口的广泛应用&#xff0c;这一梦想正逐渐变为现实。本文将详细介绍如何通过调用电商平台API接口&#…

用AI绘画年入百万?揭秘高效起始号与现变路径...

part.1 AI绘画的优势 AI绘画的魅力在于其高效和灵活 无论你是通过Midjourney还是Stable Diffusion&#xff0c;只需输入简单的提示词&#xff0c;再加上一些额外的控制调整&#xff0c;AI绘画就能快速生成各种创意内容。角色IP设计、游戏原画、3D场景甚至是天马行空的创意都…

扫雷老年版2.0无猜模式

扫雷老年版2.0无猜模式 打破记录5秒&#xff0c;到达4秒。

Skywalking告警配置

背景 skywalking 9.7.0&#xff0c;地址&#xff1a;Backend setup | Apache SkyWalking helm&#xff1a;skywalking-helm:4.5.0&#xff0c;地址&#xff1a;skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警&#xff1f; …

Java转换流

转换流 是字符流和字节流之间的桥梁 转换输出流:OutputSteamWriter 转换输入流:InputStreamReader InputStreamReader输入流 package myio;import java.io.*;public class inputsteamread {public static void main(String[] args) throws IOException {InputStreamReader…

基于SSM的家政服务网站【附源码】

基于SSM的家政服务网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统结构 4.3. 数据库设计 4.3.1 数据库实体 4.3.2 数据库设计表 4.4 数据表 第5章 系统详细设计 5.1管理员功能模块 5.2用户功能模块 5.3前…

利用低代码快速搭建电商小程序之商品列表页

目标&#xff1a; 搭建商城的一个商品列表页面&#xff08;先做静态页&#xff09; 开发环境&#xff1a; 访问白码低代码平台&#xff1a;https://www.bnocode.com/ 白码的新自定义页功能&#xff08;使用vue框架&#xff09; 前期准备&#xff1a; 需要先准备商品数据表…

LeaferJS 动画、状态、过渡、游戏框架

LeaferJS 现阶段依然专注于绘图、交互和图形编辑场景。我们引入游戏场景&#xff0c;只是希望让 LeaferJS 被更多有需要的人看到&#xff0c;以充分发挥它的价值 LeaferJS 为你带来了全新的游戏、动画、状态和过渡功能&#xff0c;助你实现那些年少时的游戏梦想。我们引入了丰富…

读论文《OmniGen: Unified Image Generation》

OmniGen演示了在单一框架内执行各种图像生成任务的能力。此外&#xff0c;它还具有推理能力和语境学习能力。 论文地址&#xff1a;2409.11340v1 (arxiv.org) 项目地址&#xff1a;GitHub - VectorSpaceLab/OmniGen 项目目前还不完整&#xff0c;论文展现的通用性十分强大&am…

【云安全】云原生安全攻防

一、云原生安全 1、云原生介绍 云原生指构建和运行应用以充分利用通过云交付模式交付的分布式计算。云原生应用旨在充分利用云平台特有的可扩展性、弹性和灵活性优势。根据云原生计算基金会 (CNCF)的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云上构建和运行…

认知杂谈82《跳出信息茧房,持续精进》

内容摘要&#xff1a; 互联网时代&#xff0c;信息丰富&#xff0c;但便捷性削弱了我们的好奇心。互联网是双刃剑&#xff0c;快速获取知识的同时&#xff0c;也让我们陷入“信息茧房”&#xff0c;限制视野。 好奇心减少&#xff0c;部分原因是互联网的“懒惰效应”&#xff0…

ProcessOn为什么导出有水印!!!(利用SVG转PNG)

processon-svg2png ProcessOn 一个非常好用的思维导图网站&#xff0c;但是为什么导出有水印&#xff01;&#xff01;&#xff01;。 功能 支持按钮拖拽支持将流程图svg 转成 png下载支持修改自定义文字下载svg&#xff08;开发中&#xff09; 安装/使用方法 安装并使用…

亚马逊跨境电商测评补单系统防关联全攻略

在跨境电商领域&#xff0c;尤其是亚马逊、速卖通等平台上&#xff0c;测评补单已成为提升产品曝光度和销量的重要手段。然而&#xff0c;但多账号操作带来的关联风险始终是卖家们需要面对的一大问题。为了维护平台的公平秩序&#xff0c;这些各电商平台实施了严格的用户管理制…

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…