首页 > 其他分享 >Vue自定义指令以及项目中封装过的自定义指令

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

时间:2024-09-18 10:51:01浏览次数:3  
标签:el Vue 自定义 绑定 value 指令


 自定义指令

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>

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

编辑

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

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


标签:el,Vue,自定义,绑定,value,指令
From: https://blog.51cto.com/u_15157190/12044283

相关文章

  • 99元阿里云服务器部署若依前后端分离版(ruoyi-vue)
    1.购买阿里云最近阿里云推出99元套餐,相当划算,薅羊毛搞起->新老同享阿里云99一年    系统选择centos2.安装JDK        JDK>=1.8虽说推荐1.8版本,但毕竟有点老,我选的JDK17,安装过程如下:#下载安装包wgethttps://download.oracle.com/java/17/archive/jdk......
  • [附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
    今天带来一款优秀的项目:个人博客系统源码 。系统采用的流行的前后端分离结构,内含功能包括"写博客文章",“修改博客文章”,“富文本编辑器”,“评论管理”“管理员角色”,“游客角色”,“文章标签”,“文章分类”如果您有任何问题,也请联系小编,小编是经验丰富的程序员! 一.系统演......
  • Vue3.5中解构props,让父子组件通信更加丝滑
    前言在Vue3.5版本中响应式Props解构终于正式转正了,这个功能之前一直是试验性的。这篇文章来带你搞清楚,一个String类型的props经过解构后明明应该是一个常量了,为什么还没丢失响应式呢?本文中使用的Vue版本为欧阳写文章时的最新版Vue3.5.5关注公众号:【前端欧阳】,给自己一个进阶vu......
  • Spring Cloud全解析:服务调用之自定义Feign的配置
    自定义Feign的配置Feign的默认配置类是FeignClientsConfiguration,其内部定义了Feign默认使用的编码器、解码器、契约、重试机制等@Bean@ConditionalOnMissingBeanpublicDecoderfeignDecoder(){//解码器,将字节数组反序列化为方法返回值类型的对象,默认只支持反序列化为St......
  • [Vue] v-html、v-show、v-if 的区别
    v-if作用:根据条件动态创建或销毁DOM元素。原理:v-if实际上是按需渲染的,它会根据表达式的真假值来决定是否在DOM树中插入或移除元素。如果条件为false,该元素不会存在于DOM中。性能:因为v-if会真正地添加或移除元素,因此它在初次渲染时的开销较大,特别是当需要频繁切换时会......
  • Vue实战指南:Vue中将一维对象数组转换为二维对象数组
    Vue实战指南:Vue中将一维对象数组转换为二维对象数组引言一维对象数组与二维对象数组的概念一维对象数组二维对象数组Vue中转换的方法示例一:使用计算属性实现转换示例二:使用methods中的函数实现转换示例三:使用Vue自定义指令实现转换示例四:使用Vuex进行状态管理实际开发......
  • 使用pnpm、monorepo 来构建 vue + 独立组件库项目
    新建项目使用pnpm进行安装pnpmcreatevue@latest在根目录下创建pnpm-workerspace.yaml文件packages:-'components/**'此处,components为根目录中的components文件夹,他是独立于我们项目的一个组件库,不包含在src内,此时目录结构如下:root-components-node_modules......
  • 基于Java+vue的大学生心理健康管理系统的设计和实现(源码+LW+调试文档)
    目录:完整视频演示:系统架构:程序运行截图:核心代码参考:   数据库sql:项目技术介绍:java介绍:Mysql数据库介绍:为什么选择我:获取源码:......
  • Java基于SpringBoot的付费自习室管理系统+Vue[毕业设计]
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍费自习室管理系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能......
  • Vue3.5+ 侦听器的3个更新
    你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。在Vue3.5+中,对于侦听器的更新有以下几个方面:暂停/恢复侦听器、副作用清理/onWatcherCleanup和deep遍历深度,如果对此熟悉可以直接划走了,如果没有划走就一起看看吧。暂停/恢复侦听器在Vue3.5之前,watch和watchEffect有......