当前位置: 首页 > news >正文

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

自定义指令

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或类似的状态管理库,实现了基于权限和角色的元素显示控制。这种机制有助于提高前端页面的安全性和用户体验,确保用户只能看到和操作他们被授权访问的内容。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ACE之ACE_Reactor_Notify
  • C++ List (带你一篇文章搞定C++中的List类)
  • 如何申请和使用免费SSL证书
  • 加速开发体验:为 Android Studio 设置国内镜像源
  • Web植物管理系统-下位机部分
  • java项目之基于springboot的贸易行业crm系统(源码+文档)
  • “Fast-forward“ in git-pull result
  • 音视频入门基础:AAC专题(3)——AAC的ADTS格式简介
  • python中Web开发框架的使用
  • C++掉血迷宫
  • rockylinux9.4单master节点k8s1.28集群部署
  • WordPress建站钩子函数及使用
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • USDT自动化交易【Pinoex】【自动化分析】【ChatGPT量化脚本】
  • mysql时间戳格式化yyyy-mm-dd
  • CentOS 7 修改主机名
  • Cookie 在前端中的实践
  • CSS实用技巧干货
  • CSS中外联样式表代表的含义
  • golang中接口赋值与方法集
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • NSTimer学习笔记
  • Python中eval与exec的使用及区别
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SpringBoot几种定时任务的实现方式
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 前端学习笔记之观察者模式
  • 如何胜任知名企业的商业数据分析师?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 在Docker Swarm上部署Apache Storm:第1部分
  • postgresql行列转换函数
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​插件化DPI在商用WIFI中的价值
  • # include “ “ 和 # include < >两者的区别
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #知识分享#笔记#学习方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (6)STL算法之转换
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)SvelteKit教程:layout 文件
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (原創) 未来三学期想要修的课 (日記)
  • (转)http协议
  • .Family_物联网
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 受管制代码