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

Vue.js 自定义指令:从零开始创建自己的指令

vue使用directive

  • 前言
  • vue2使用
  • vue3使用

前言

关于使用自定义指令在官网中是这样描述的

vue2:对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。

在 Vue.js 中使用自定义指令(directive)可以带来许多好处,包括但不限于这些:

  • 代码复用:自定义指令可以封装一些常用的 DOM 操作,使得这些操作可以在多个组件中复用,减少代码冗余。
  • 简化模板:通过自定义指令,可以将一些复杂的 DOM 操作从模板中移除,使模板更加简洁和易读。
  • 增强功能:自定义指令可以提供一些 Vue 框架本身不直接支持的功能,比如自动聚焦、拖拽、动画等。
  • 更好的封装性:自定义指令可以将 DOM 操作的逻辑封装在指令内部,使得组件的代码更加清晰和模块化。
  • 更细粒度的控制:自定义指令可以绑定到特定的 DOM 元素或属性,提供更细粒度的控制,比如只对某个元素应用某些效果。
  • 生命周期钩子:自定义指令提供了生命周期钩子函数,可以在不同的阶段执行特定的逻辑。

vue2使用

在vue2使用使用directive根据官网介绍可以这样使用

// 注册一个全局自定义指令 `v-focus`
import Vue from 'vue'
Vue.directive('focus', {// 当被绑定的元素插入到 DOM 中时……inserted: function (el) {// 聚焦元素el.focus()}
})

然后在页面中绑定

<input v-focus>

这样就能 聚焦元素 的效果
在这里插入图片描述

当然在项目中可以更加优化
在这里插入图片描述
这里单独创建一个文件夹来存放自定义指令的js文件并使用index导出引入的文件, 这里拿两个实例来举例子 ,一个是复制文本的copy.js文件,一个控制权限的role.js文件。

main.js 文件这样集中引入指令文件

import Vue from 'vue'
import App from './App.vue'
import directives from './directives';Vue.config.productionTip = falseObject.keys(directives).forEach(name => {Vue.directive(name, directives[name]);
});new Vue({render: h => h(App),
}).$mount('#app')

index.js 文件导出引入的指令

import copy from './copy';
import role from './role';export default {copy,role
};

copy.js文件

import { Message } from 'element-ui';
let timer = null;
const copy = {bind(el, binding) {if (binding.value) {el.addEventListener('click', () => copyClick(el, binding));}},
};
const copyClick = (el, binding) => { if (timer) clearTimeout(timer);timer = setTimeout(async () => { await navigator.clipboard.writeText(binding.value);Message.success('复制成功!');timer = null;}, 200);
};
export default copy;

role.js文件

const role = {bind (el, binding) { //只有包含了2的dom元素才显示if (!binding.value.includes(2)) {el.style.display = 'none';}},
};export default role;

最后在文件中使用

<template><div class="hello"><el-button type="primary" round v-copy="text">点击我复制</el-button><li v-role="[1]">这是一号dom</li><li v-role="[1,2]">这是二号dom</li><li v-role="[1,2,3]">这是三号dom</li></div>
</template><script>
export default {name: 'HelloWorld',data () {return {text: 'hello world'}}
}
</script>

最后看实际效果
请添加图片描述
这就是基础的使用,
关于生命周期钩子函数
官网提供了像bindinsertedupdatecomponentUpdatedunbind等,可以在不同的阶段执行特定的逻辑。
更多的参考 vue2指令官网

vue3使用

在vue3中使用指令与vue2写法有点不同
官网是这样使用的

const app = createApp({})// 使 v-focus 在所有组件中都可用
app.directive('focus', {/* ... */
})// 使用的组件
<template><input v-focus />
</template>

这里的举例跟vue2的一样,不过项目是用vite+ts搭建的
在这里插入图片描述
单独创建一个文件夹来存放自定义指令的js文件并使用index导出引入的文件, 这里拿两个实例来举例子 ,复制文本的copy.ts文件和控制权限的role.ts文件。

main.ts 文件这样集中引入指令文件

import { createApp } from 'vue' 
import App from './App.vue' 
import directives from './directives';const app = createApp(App)for (const [name, directive] of Object.entries(directives)) {app.directive(name, directive);
}   app.mount('#app')

在index.ts 文件中导出

import copy from './copy';
import role from './role';export default {copy,role
};

copy.ts文件

import { DirectiveBinding } from 'vue';
import { ElMessage } from 'element-plus';
let timer: any = null;
const copy = {mounted(el: HTMLElement, binding: DirectiveBinding) {if (binding.value) {el.addEventListener('click', () => copyClick(el, binding));}},
};
const copyClick = (el: HTMLElement, binding: DirectiveBinding) => { if (timer) clearTimeout(timer);timer = setTimeout(async () => {// 复制文本await navigator.clipboard.writeText(binding.value);ElMessage.success('复制成功!');timer = null;}, 200);
};
export default copy;

role.ts文件

import { DirectiveBinding } from 'vue';
const role = {mounted(el: HTMLElement, binding: DirectiveBinding) {//包含了 2 的元素才显示if (!binding.value.includes(2)) {el.remove();}},
};
export default role;

使用的vue件

<script setup lang="ts">
import { ref } from "vue";
const text = ref("这是赋值的值12345");
</script><template><el-button type="primary" round v-copy="text">点击我复制</el-button><li v-role="[1]">这是一号dom</li><li v-role="[1,2]">这是二号dom</li><li v-role="[1,2,3]">这是三号dom</li>
</template>

最后看效果
请添加图片描述
最后关于生命周期钩子函数,官网给出了这些
在这里插入图片描述
更多的扩展使用可以参考官网
vue3指令官网

相关文章:

Vue.js 自定义指令:从零开始创建自己的指令

vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作&#xff0c;这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令&#xf…...

策略模式

定义&#xff1a;即定义一系列的算法&#xff0c;算法1&#xff0c;算法2&#xff0c;...&#xff0c;算法n&#xff0c;把他们封装起来&#xff0c;使他们可以相互替换。 优点&#xff1a;使得一个类的行为或者其算法可以在运行时改变&#xff0c;而且使用Context类的人在外部…...

性能优化--CPU微架构

一 指令集架构 Intel X86, ARM v8, RISC-V 是当今广泛使用的指令架构的实例。 大多数现代架构可以归类为基于通用寄存器的加载和存储型架构&#xff0c;在这种架构下&#xff0c;操作数倍明确指定&#xff0c;只能使用夹在和存储指令访问内存。除提供基本的功能之外&#xff0c…...

在 Sanic 框架中实现高效内存缓存的多种方法

在使用 Sanic 框架开发 Web 应用时&#xff0c;我们可以通过内存缓存来提升应用的性能&#xff0c;减少对数据库或其他外部服务的频繁请求。下面提供一些在 Sanic 中实现内存缓存的基本方法。 使用 Python 内置的 functools.lru_cache 如果你的缓存需求比较简单&#xff0c;且…...

Mac 环境变量配置基础教程

MacOS 下一般配置有多个 Shell&#xff0c;如 Bash、ZSH 等&#xff0c;不同的 Shell 其创建 Terminal 时使用的环境变量配置文件也不尽相同&#xff0c;但一般都会读取并执行脚本文件 /etc/profile 来加载系统级环境变量&#xff0c;而用户级别环境变量&#xff0c;一般都会在…...

Qt如何屏蔽工具栏(QToolBar)自动折叠功能

最近发现Qt上工具栏一行放不下的时候&#xff0c;会自动折叠起来。当用户点击展开功能的小三角按钮时&#xff0c;工具栏会展开成多行。这个功能本身没什么问题&#xff0c;但是当工具栏展开的时候&#xff0c;鼠标光标一旦不小心移动到了工具栏外面&#xff0c;这时候&#xf…...

【数据分享】中国统计摘要(1978-2024)

数据介绍 《中国统计摘要&#xff08;1978 - 2024&#xff09;》犹如一部浓缩的历史巨著&#xff0c;承载着中国几十年来的发展轨迹与辉煌成就。它是由国家统计局精心编纂的重要资料&#xff0c;为我们全方位地展现了中国在经济、社会、民生等各个领域的深刻变革。 这本统计摘…...

unity运行状态下移动、旋转、缩放控制模型

demo地址&#xff1a;https://download.csdn.net/download/elineSea/90017272 unity2021以上版本用下面的插件 https://download.csdn.net/download/elineSea/90017305...

《 C++ 点滴漫谈 一 》C++ 传奇:起源、演化与发展

摘要 C 是一门兼具高效性与灵活性的编程语言&#xff0c;自上世纪 80 年代诞生以来&#xff0c;已经深刻影响了计算机科学与技术的发展。从 Bjarne Stroustrup 的初步构想到如今遍布各大领域&#xff0c;C 经历了语言规范的不断完善与功能的持续扩展。本文详细回顾了 C 的起源…...

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…...

自然语言处理:第六十三章 阿里Qwen2 2.5系列

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor 项目地址: QwenLM/Qwen2.5: Qwen2.5 is the large language model series developed by Qwen team, Alibaba Cloud. 官网地址: 你好&#xff0c;Qwen2 | Qwen & Qwen2.5: 基础模型大派对&a…...

springboot中设计基于Redisson的分布式锁注解

如何使用AOP设计一个分布式锁注解&#xff1f; 1、在pom.xml中配置依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.26</version></dependency><dependenc…...

C++初阶学习第十一弹——list的用法和模拟实现

目录 一、list的使用 二.list的模拟实现 三.总结 一、list的使用 list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。 常见的list的函数的使用 std::list<int> It {1,…...

共享单车管理系统项目学习实战

前言 Spring Boot Vue前后端分离 前端&#xff1a;Vue&#xff08;CDN&#xff09; Element axios(前后端交互) BaiDuMap ECharts(图表展示) 后端&#xff1a;Spring Boot Spring MVC(Web) MyBatis Plus(数据库) 数据库:MySQL 验证码请求...

详细解读TISAX汽车信息安全评估

TISAX汽车信息安全评估是一个针对汽车行业的信息安全评估和交换机制&#xff0c;以下是对其的详细解读&#xff1a; 一、背景与目的 TISAX是在德国汽车工业协会&#xff08;VDA&#xff09;的支持下开发的&#xff0c;旨在确保跨公司边界的汽车行业信息安全评估的认可度&…...

gitlab cicd搭建及使用笔记(二)

cicd之gitlab-runner使用要点 官方链接&#xff1a;https://docs.gitlab.com/runner/ 附历史文章链接 https://blog.csdn.net/qq_42936727/article/details/143624523?spm1001.2014.3001.5501 gitlab-runner常用命令及解释 gitlab-runner verify 容器内&#xff0c;检查注…...

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…...

Spring Security SecurityContextHolder(安全上下文信息)

在本篇博客中&#xff0c;我们将讨论 Spring Security 的 SecurityContextHolder 组件&#xff0c;包括其实现方式、关键特性&#xff0c;并通过实际示例进行说明。 理解 SecurityContextHolder SecurityContextHolder 是 Spring Security 存储当前安全上下文详细信息的地方。…...

蓝队技能-应急响应篇日志自动采集日志自动查看日志自动化分析Web安全内网攻防工具项目

知识点&#xff1a; 1、应急响应-系统日志收集-项目工具 2、应急响应-系统日志查看-项目工具 3、应急响应-日志自动分析-项目工具 演示案例-蓝队技能-工具项目-自动日志采集&自动日志查看&自动日志分析 系统日志自动采集-观星应急工具(Windows系统日志) SglabIr_Co…...

Python JSON 数据解析教程:从基础到高级

Python JSON 数据解析教程&#xff1a;从基础到高级 引言 在现代编程中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。它以易于阅读和编写的文本格式存储和传输数据&#xff0c;广泛应用于Web API和配置文件中。Python提供了…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...