Vue自定义指令以及项目中封装过的自定义指令

news2024/9/20 7:30:42

自定义指令

Vue 自定义指令是 Vue.js 框架中一个非常强大的功能,它允许你注册一些全局或局部的自定义 DOM 操作指令,以便在模板中复用。自定义指令通过 Vue.directive() 方法进行全局注册,或者在组件的 directives 选项中局部注册。

自定义指令的钩子函数

Vue 自定义指令可以包含几个钩子函数(也称为生命周期钩子),这些函数会在不同的时间点被调用:

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用(保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。
  • componentUpdated:被绑定元素所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

注册自定义指令

全局注册
Vue.directive('my-directive', {  
  bind(el, binding, vnode, oldVnode) {  
    // 逻辑...  
  },  
  // 其他钩子...  
});
局部注册
export default {  
  directives: {  
    focus: {  
      // 指令的定义  
      inserted: function (el) {  
        el.focus();  
      }  
    }  
  }  
}

钩子函数的参数

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下属性:
    • value:指令的绑定值,例如 v-my-directive="1 + 1" 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive="someValue" 中,表达式为 "someValue"
    • arg:传给指令的参数,可选。例如 v-my-directive:arg="value" 中,参数为 "arg"
    • modifiers:一个包含修饰符的对象。例如 v-my-directive.modifier,修饰符对象 modifiers 的 modifier 属性为 true
  • vnode:Vue 编译生成的虚拟节点。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用

使用自定义指令

在模板中,你可以这样使用自定义指令

<div v-my-directive="someValue"></div>

或者,如果指令需要参数或修饰符:

<div v-my-directive:arg.modifier="value"></div>

Vue.directive('color-switch', {  
  // 当绑定元素插入到 DOM 中...  
  inserted: function (el, binding) {  
    // 根据绑定值来更改元素的颜色  
    el.style.color = binding.value;  
  },  
  // 当绑定值更新时...  
  update: function (el, binding) {  
    // 同样地,更改元素的颜色  
    el.style.color = binding.value;  
  }  
});  
  
// 然后在模板中使用它  
<span v-color-switch="'red'">这是红色的文本</span>

项目中使用封装的自定义指令

在若依(RuoYi)框架中,除了假设的v-focus示例外,实际上框架中常用的自定义指令主要围绕权限控制进行设计,如v-hasPermiv-hasRole。这些指令在Vue前端中用于根据用户的权限或角色来决定是否显示某个元素或组件。

自定义指令详解

1. v-hasPermi

原理

v-hasPermi指令用于控制元素的显示与隐藏,基于用户的操作权限。当绑定的权限值与用户实际拥有的权限匹配时,元素会显示;否则,元素会被隐藏或移除。

代码解析

// 假设的v-hasPermi指令定义  
export default {  
  mounted(el, binding, vnode) {  
    const { value } = binding; // 获取指令绑定的值(权限字符串数组)  
    const permissions = useUserStore().permissions; // 从Vuex或类似的状态管理中获取用户权限  
  
    if (value && value instanceof Array && value.length > 0) {  
      const hasPermissions = permissions.some(permission => {  
        // 检查用户是否拥有任意一个指定的权限  
        return permission === "*:*:*" || value.includes(permission);  
      });  
  
      if (!hasPermissions) {  
        el.parentNode && el.parentNode.removeChild(el); // 如果没有权限,则移除元素  
      }  
    } else {  
      throw new Error('请设置操作权限标签值'); // 如果没有设置权限值,则抛出错误  
    }  
  }  
}

注意:上述代码是假设性的,并且mounted钩子可能不是最适合的(因为Vue自定义指令通常使用insertedbind钩子),但这里为了说明原理而使用。实际上,v-hasPermi可能使用insertedbind钩子来确保在元素插入DOM后立即执行权限检查。

2. v-hasRole

原理

v-hasPermi类似,v-hasRole指令用于根据用户的角色来控制元素的显示与隐藏。当绑定的角色值与用户实际拥有的角色匹配时,元素会显示;否则,元素会被隐藏或移除。

代码解析(假设性):

// 假设的v-hasRole指令定义  
export default {  
  mounted(el, binding, vnode) {  
    const { value } = binding; // 获取指令绑定的值(角色字符串数组)  
    const roles = useUserStore().roles; // 从Vuex或类似的状态管理中获取用户角色  
  
    if (value && value instanceof Array && value.length > 0) {  
      const hasRole = roles.some(role => {  
        // 检查用户是否拥有任意一个指定的角色  
        return role === "admin" || value.includes(role);  
      });  
  
      if (!hasRole) {  
        el.parentNode && el.parentNode.removeChild(el); // 如果没有对应角色,则移除元素  
      }  
    } else {  
      throw new Error('请设置角色权限标签值'); // 如果没有设置角色值,则抛出错误  
    }  
  }  
}

同样,上述代码是假设性的,并且可能需要根据实际的项目结构和需求进行调整。

总结

在若依框架中,v-hasPermiv-hasRole是两个重要的自定义指令,它们通过Vue的自定义指令机制,结合Vuex或类似的状态管理库,实现了基于权限和角色的元素显示控制。这种机制有助于提高前端页面的安全性和用户体验,确保用户只能看到和操作他们被授权访问的内容。

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

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

相关文章

YOLOV8输出预测框的坐标信息

结果&#xff1a;&#xff08;前提是对应类别的yolov8模型已经训练好&#xff09; 具体实现&#xff1a; 在ultralytics\utils\plotting.py里面 CtrlF搜索box_label 再次照片的最后一行输入&#xff1a; # 左上角cv2.putText(self.im, f"({p1[0]}, {p1[1]})", (p1…

计算机毕业设计选题推荐-共享图书管理系统-小程序/App

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【北京迅为】《STM32MP157开发板使用手册》- 第三十一章Cortex-M4窗口看门狗实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

国外SIM卡有信号无法连接,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

[Java]SpringBoot能力进阶

配置优先级 SpringBoot中支持三种格式的配置文件 优先级: application.properties文件 > application.yml文件 > application.yaml文件 SpringBoot除了通过配置文件配置属性, 还支持Java系统属性和命令行参数的方式 进行属性配置 1.在IDEA中配置java系统属性和命令行参…

19、Python如何读写excel文件

在数据处理和分析时&#xff0c;经常使用Excel&#xff0c;而手动操作Excel可能非常繁琐和耗时。Python提供了许多强大的库和工具&#xff0c;可以方便地操作Excel文件。 在Python标准库中是不支持Excel读写的&#xff0c;我们要安装第三方库来实现。 在Python中操作Excel有多…

设计一个高质量的API接口:提升应用性能的关键步骤

在当今的软件开发世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率&#xff0c;还能提升用户体验&#xff0c;并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口&#xff…

Golang | Leetcode Golang题解之第412题Fizz Buzz

题目&#xff1a; 题解&#xff1a; func fizzBuzz(n int) (ans []string) {for i : 1; i < n; i {sb : &strings.Builder{}if i%3 0 {sb.WriteString("Fizz")}if i%5 0 {sb.WriteString("Buzz")}if sb.Len() 0 {sb.WriteString(strconv.Itoa(i…

Davinci 大数据可视化分析

Davinci 大数据可视化分析 一、Davinci 架构设计1.1 Davinci定义1.2 Davinci 应用场景 二、Davinci 安装部署2.1 部署规划2.2 前置环境准备2.3 Davinci部署2.3.1 物料准备2.3.2 安装配置 2.4 环境变量配置2.5 初始化数据库2.5.1 创建数据库及用户 2.5.2 建表2.6 初始化配置 三、…

开源免费的NAS系统-TrueNAS CORE搭建和使用(保姆级教程)

TrueNAS CORE说明 TrueNASCORE(以前称为 FreeNAS)是世界上最受欢迎的存储操作系统,因为它使您能够构建自己的专业级存储系统,用于各种数据密集型应用程序,而无需任何软件成本。只需将其安装到硬件或虚拟机上,即可体验开源存储的真正存储自由。 TrueNAS提供了CORE和Ente…

如何用python构建简单神经网络?

今天&#xff0c;我们将运用Python来搭建一个简单的神经网络模型&#xff01;并深入浅出地探索其背后的运作原理。 多输入 提及神经网络时&#xff0c;我们可以将其视为一个高度灵活的函数来理解和应用。 为了做出准确的预测&#xff0c;我们需要构建能够同时组合多个输入的…

吸浮毛宠物空气净化器推荐,希喂、小米、有哈宠物空气净化器测评

养猫需谨慎&#xff0c;不然就要做猫奴一辈子啦&#xff01;上次堂妹来我家住几天&#xff0c;刚开始还担心和猫处不来&#xff0c;不敢去摸它&#xff0c;走的时候已经约好下次来看它的时间&#xff0c;笑死我了。毕竟猫咪这么可爱&#xff0c;很少有人可以抵抗它的魅力。 这不…

Zabbix 2024 中国峰会在上海举办,Databuff 携最业界领先研发成果重磅亮相

9月13日&#xff0c;Zabbix中国峰会在上海圆满结束。会上共进行了18场技术演讲&#xff0c;共有超过500人参加了本次盛会。 大会开始&#xff0c;Zabbix创始人Alexei Vladishev介绍了Zabbix7.0新功能以及未来的发展蓝图。 随后&#xff0c;乘云数字CEO向成钢分享了《如何打造开…

JVM 调优篇7 调优案例4- 线程溢出

一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间&#xff0c;当 JVM 向底层操作系统请求创建一个新的 native 线程时&#xff0c;如果没有足够的资源分配就会报此类错误。报错信息&#xff1a;java.lang.outofmemoryError:unable to create new Native Thr…

集群软件在linux上的安装

前置准备 为了保证各个服务器之间的正常通信&#xff0c;要完成集群化环境的前置准备&#xff0c;包括创建多台虚拟机&#xff0c;配置主机名映射&#xff0c;SSH免密登录等等。 配置多个虚拟机 配置多台Linux虚拟机 安装集群化软件&#xff0c;首要条件就是要有多台Linux服务…

web基础—dvwa靶场(四)​File Inclusion

File Inclusion(文件包含) 有些 web 应用程序允许用户指定直接文件流的输入&#xff0c;或允许用户将文件上载到服务器。稍后 web 应用程序访问 web 应用程序上下文中用户提供的输入。通过这样种操作&#xff0c;web 应用程序允许恶意文件执行。 如果选择要包含的文件是目标计…

【系统方案】智慧园区数字园区整体解决全套方案(PPT,Word原件等)

智慧园区建设要点可归纳为以下几点&#xff1a; 基础设施建设&#xff1a;构建高速、稳定的网络基础设施&#xff0c;部署物联网设备&#xff0c;实现园区内设备的互联互通&#xff0c;为智慧化应用提供基础支撑。 数据平台建设&#xff1a;建立统一的数据中心&#xff0c;整合…

Linux中安装maven

Linux中安装maven 1.下载2.安装3.配置环境变量4.maven相关配置 1.下载 下载地址&#xff1a;https://maven.apache.org/download.cgi 2.安装 指定位置上传压缩包&#xff1a; 解压&#xff1a; tar -zxvf apache-maven-3.9.5-bin.tar.gz修改解压缩后的文件名: mv apac…

c++刷题

17.电话号码的组合 来源于题解思路&#xff1a; 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…

从AI应用排行榜选择AI产品(9月)

2024年9月13日&#xff0c;OpenAI公司宣布推出其全新的AI模型&#xff1a;o1&#xff0c;在数学、编程和科学问题的解决处理能力上取得了显著进步。该模型通过自我对弈强化学习&#xff08;Self-play RL&#xff09;和思维链&#xff08;Chain of Thought, CoT&#xff09;技术…