Vue指令详解——以若依框架中封装指令为例分析

自定义指令

在Vue.js中,自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释:

一、自定义指令的基本概念

自定义指令允许开发者直接对DOM元素进行低层次操作,而无需编写大量的模板或者JavaScript代码。它们可以响应Vue的响应式系统,从而在数据变化时触发相应的DOM更新。

二、自定义指令的注册

  1. 全局注册

使用Vue.directive(name, definition)方法可以在全局范围内注册一个自定义指令。例如:

Vue.directive('my-directive', {
// 指令的定义
bind: function (el, binding, vnode, oldVnode) {
// 只调用一次,指令第一次绑定到元素时调用
// 在这里可以进行一次性的初始化设置
},
// 其他钩子函数...
});
  1. 局部注册

在组件中,可以使用directives选项来局部注册自定义指令。例如:

export default {
directives: {
'my-directive': {
// 指令的定义
bind: function (el, binding, vnode) {
// ...
},
// 其他钩子函数...
}
},
// 其他组件选项...
};

或者在setup函数中使用directives选项:

<script setup>
const myDirective = {
// 指令的定义
mounted: (el) => {
// ...
},
// 其他钩子函数...
};
</script><template>
<div v-my-directive></div>
</template>

三、自定义指令的钩子函数

自定义指令可以包含多个钩子函数,这些钩子函数在指令的不同生命周期阶段被调用:

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

四、自定义指令的参数和修饰符

  1. 参数:指令的参数可以是动态的,通过v-mydirective:[argument]="value"的形式传递。在指令的钩子函数中,可以通过binding.arg访问到参数的值。
  2. 修饰符:修饰符是以.开头的特殊后缀,用于对指令的行为进行微调。在指令的钩子函数中,可以通过binding.modifiers访问到修饰符的对象。

五、自定义指令的示例

以下是一个简单的自定义指令示例,用于在元素上添加点击时的动画效果:

Vue.directive('click-animate', {
bind(el, binding) {
// 定义点击时的动画效果
el.animateClick = () => {
el.classList.add('click');
setTimeout(() => {
el.classList.remove('click');
}, 100);
};
},
handleEvent(event) {
if (event.type === 'click') {
el.animateClick();
}
}
});

在模板中使用:

<button v-click-animate>Click me!</button>

六、自定义指令的注意事项

  1. 在使用自定义指令时,请确保指令的名称不与Vue的内置指令冲突。
  2. 在指令的钩子函数中,请避免直接修改binding对象的属性,因为它是只读的。
  3. 如果需要在多个组件中重复使用自定义指令,建议将其注册为全局指令。

综上所述,Vue中的自定义指令提供了一种强大的方式来扩展Vue的功能,允许开发者直接对DOM元素进行低层次操作,并响应数据的变化。通过合理地使用自定义指令,可以实现各种复杂的DOM操作和逻辑控制。

若依框架中自定义指令分析

1.登录系统

根据用户后端返回用户信息,包括permisssions(Array)、roles和users 信息

 2.封装v-hasPermi指令(src/directive/permission/hasPermi.js)

用于判断当前用户是否有此权限。没有此权限(如:普通用户没有删除信息的权限)对应按钮就将移除【通过指令钩子函数的el参数修改DOM】

import store from '@/store'export default {//可访问到DOMinserted(el, binding, vnode) {const { value } = bindingconst all_permission = "*:*:*";//所有权限const permissions = store.getters && store.getters.permissions//vuex中存的当前用户右的权限//绑定时为v-hasPermi="[]",值为数组类型if (value && value instanceof Array && value.length > 0) {const permissionFlag = value//当前按钮所需权限//当前用户是否存在此权限const hasPermissions = permissions.some(permission => {return all_permission === permission || permissionFlag.includes(permission)})if (!hasPermissions) {//没有对应权限就移除对应按钮!!!el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`请设置操作权限标签值`)}}
}

3.导出所有自定义指令至插件index.js(src/directive/index.js) 

将项目封装的所有指令以插件的型式导出去

import hasRole from './permission/hasRole'
import hasPermi from './permission/hasPermi'
import dialogDrag from './dialog/drag'
import dialogDragWidth from './dialog/dragWidth'
import dialogDragHeight from './dialog/dragHeight'
import clipboard from './module/clipboard'const install = function(Vue) {Vue.directive('hasRole', hasRole)Vue.directive('hasPermi', hasPermi)Vue.directive('clipboard', clipboard)Vue.directive('dialogDrag', dialogDrag)Vue.directive('dialogDragWidth', dialogDragWidth)Vue.directive('dialogDragHeight', dialogDragHeight)
}if (window.Vue) {window['hasRole'] = hasRolewindow['hasPermi'] = hasPermiVue.use(install); // eslint-disable-line
}export default install

4.使用指令

使用 v-directiveName="value"

        <el-buttontype="primary"plainicon="el-icon-plus"size="mini"@click="handleAdd"v-hasPermi="['system:dept:add']">新增</el-button>

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

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

相关文章

基于微信小程序的大学生心理健康测评系统设计与实现,LW+源码+讲解

摘 要 随着移动互联网的发展&#xff0c;理论和技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 在当前的数字化世界中&#xff0c;自动化已经成为我们日常生活和工作中的关键部分。它不仅提…

jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息

1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类&#xff0c;生成token以及解析token package com.niuniu.gateway.uti…

基于Multisim数字电子秒表计时器电路(含仿真和报告)

【全套资料.zip】数字电子秒表电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 数字电子秒表电路 1.秒表由3个显示器显示&#xff0c;其中显示分辩率为1s&#xff0c;计时范围是6分59…

手把手教你30秒下载Typora通用版(mac、win适用)

话不多说&#xff01; 1、去官网选择mac版本下载安装&#xff1a; typora下载 然后打开 typora 包内容找到 / Applications / Typora . app / Contents / Resources / TypeMark / 用编辑器打开上面文件夹&#xff0c; vscode 示例&#xff1a; 找到 page - dist / static / …

鸿蒙ZRouter动态路由框架—生命周期管理能力

文章目录 基本使用(单个页面生命周期&#xff09;页面的全局生命周期监听工作流程图源码 ZRouter从1.1.0版本开始支持生命周期函数管理能力&#xff0c;主要有以下特点&#xff1a; 不影响你原有的生命周期业务逻辑&#xff0c;对NavDestination页面保持着零侵入性&#xff0c;…

英伟达GB200、B200、H200、H100、A100、4090的参数对比

以下是英伟达GB200、B200、H200、H100、A100、4090的参数对比&#xff1a; 型号 架构 制造工艺 晶体管数量 显存类型 显存容量 显存带宽 CUDA核心数 其他主要特性 GB200 Blackwell 未知 2个B200 GPU共4160亿 HBM3e 每颗B200 GPU 192GB&#xff08;总384GB&#x…

IntelliJ+SpringBoot项目实战(五)--配置Druid在线监控数据库

阿里的Druid插件有可视化监控数据库性能的界面。在SpringBoot中集成Druid后&#xff0c;可以进入可视化Html界面监控数据库运行情况。本文先介绍Druid的管理界面&#xff0c;然后在介绍Druid的详细配置。 首先访问http://localhost:8001/druid/ ,打开登录页面&#xff1a; 然后…

2024年小红书代运营公司推荐:品牌种草新阵地

2024年小红书代运营公司推荐&#xff1a;品牌种草新阵地 随着今年双十一的落幕&#xff0c;各大平台通过各具特色的活动实现了优异的表现&#xff0c;标志着国内电商市场全面进入了全域运营的新时代。未来&#xff0c;电商行业将呈现“货架电商内容电商”相结合的趋势。小红书作…

什么是闰秒?

闰秒概念是 1972年提出的&#xff0c;之所以有这个概念&#xff0c;主要是因为由于潮汐等自然现象的影响&#xff0c;地球的自转速度并不是恒定的。 所以&#xff0c;每隔一段时间世界标准时间「协调世界时&#xff08;UTC&#xff09;」会依据地球围绕太阳运动计算的「世界时…

PySide6百练成真(9)

资源的加载 给控件加上图标 1.内置图标 2.自定义资源文件 3.Rcc的使用(基于designer) 4.如果获取资源文件 rcc的使用,基于xml文件 内置图标 from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QLineEdit, QToolBox, QMainWindow, QPushButton,QSt…

cmake vscode

cmake_minimum_required(VERSION 3.20.0) project(my_hello) //指定项目 set(CMAKE_CXX_STANDARD 11) //指定c的版本 include_directories( P R O J E C T S O U R C E D I R / i n c l u d e ) / / 包含头文件的目录 / / 指定可执行文件生成目录 s e t ( E X E C U T A B L E…

李耳著《老子》与董仲舒著《道德经》有何区别?

马王堆帛书《老子》的发现&#xff0c;确实为研究《道德经》提供了更为接近原始的版本&#xff0c;其内容与传世本存在诸多不同之处&#xff0c;这些差异不仅体现在文字和篇章结构上&#xff0c;更在于思想内涵和哲学意蕴的深度。以下是具体分析&#xff1a; 版本命名&#xff…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…

游戏行业使用高防独立IP有什么好处?

独立的IP就是您的虚拟主机自己有一个单独的IP地址&#xff0c;这样&#xff0c;您的用户除了记住您的域名外&#xff0c;在浏览器的地址栏敲入您的IP地址也能访问到您的网站。如果没有独立IP的话&#xff0c;别人要访问您的网站只能敲入域名才行。 而高防ip是指高防机房所提供的…

Android ANR分析总结

1、ANR介绍 ANR&#xff08;Application Not Responding&#xff09;指的是应用程序无响应&#xff0c;当Android应用程序在主线程上执行长时间运行的操作或阻塞I/O操作时发生。这可能导致应用程序界面冻结或无法响应用户输入。 1、Service ANR&#xff1a;前台20s&#xff0…

【comfyui教程】comfyui攻略:故障报错应对指南!

前言 ComfyUI的常见故障和解决&#xff0c;赶紧收藏起来&#xff0c; 在探索ComfyUI的曲折旅途中&#xff0c;最让人心生畏惧的莫过于那漫天的红色方框和层出不穷的报错信息。它们如同不息的风暴&#xff0c;一波未平&#xff0c;一波又起&#xff0c;令无数热忱的初学者在这…

[论文精读]SeqMIA: Sequential-Metric Based Membership Inference Attack

图像领域成员推理攻击 SeqMIA: Sequential-Metric Based Membership Inference Attack http://arxiv.org/abs/2407.15098 ACM CCS 2024 先看overview&#xff0c;猜测文章的方法&#xff1a;训练影子模型&#xff0c;使用影子模型、蒸馏数据集和目标模型共同参与蒸馏任务&am…

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transform 3.特征…

watermark大模型水印详解

一 watermark定义 模型水印是一种用于模型版权保护的技术&#xff0c;通过向大模型植入水印&#xff08;触发集数据加上特定的噪声或者标志&#xff09;&#xff0c;使得模型学习到这种特定的噪声或者标志的特征&#xff0c;通过特定的问题可以从大模型的回答中提取出水印进行…