Vue常用自定义指令-积累的魅力【VUE】
前言
- 在【自定义指令—v2与v3之间的区别【VUE基础】一文中,整理了自定义指令部分
vue2
和vue3
两个版本的区别,有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。- 此次主要介绍一些自己积累的一些自定义指令的代码,与大家一起分享。
- 后续,开发中如果有新的比较有意思的部分,会同步更新。
文章目录
- 前言
- 1.基本介绍
- 1-1.基本概念
- 1-2.核心特征
- 1-3.实现方式
- 2.常用自定义指令代码分享
- 2-1.搜索文本高亮
- 解释说明:
- 代码分享:
- 2-2.页面拖拽
- 解释说明:
- 代码分享:
- 2-3.自动聚焦(v2 和 v3)
- 3.参考资源
1.基本介绍
当前简单介绍一下自定义指令,如需了解更多关于自定义指令的基础知识,【点击跳转自定义指令基础】
1-1.基本概念
- 定义:自定义指令是
Vue
提供的扩展机制,用于封装对DOM
元素的底层操作逻辑 - 与内置指令区别:内置指令如
v-if/v-for
可直接使用,而自定义指令需要开发者显式注册 - 适用场景:主要用于需要直接操作
DOM
元素的复用逻辑
1-2.核心特征
- 命名规范:
- 必须以
v-
开头 - 在
<script setup>
中可使用驼峰命名变量自动转换 - 生命周期钩子:
mounted
:元素插入父节点时调用updated
:组件VNode更新时调用unmounted
:元素从父节点移除时调用- 参数传递:
el
:指令绑定的DOM
元素binding
:包含value/oldValue
等属性的对象
1-3.实现方式
1.全局注册
app.directive('highlight',{mounted(el,binding) {el.focus()}
})
2.局部注册,即组件中注册
directives: {highlight: {mounted(el,binding) {el.focus()}}
2.常用自定义指令代码分享
2-1.搜索文本高亮
展示效果:
解释说明:
- 效果:
- 搜索到的结果列表中匹配搜索关键字,并高亮展示;
- 实现方式:
- 获取元素节点,以及节点中的数据
- 使用正则去匹配对应字段;
- 生成新的元素,去替换匹配的部分。
- 使用场景:搜索结果展示,突然搜索关键字
- 使用注意:
- 当前这种方式因为执行在mounted 钩子函数中,只在节点加载第一次时执行,所以要想实现如上所示,就使用了定时器的异步加载,先清除,再重新过滤结果,重新加载。
- 如果有更好的办法,可以留言,欢迎指正。
代码分享:
- highlight.js
export const highLight = {mounted(el, binding) {const { value } = binding;const regExp = new RegExp(value, "gi");const highLightText = (node) => {if (node.nodeType === 3) {const text = node.nodeValue;const newNode = document.createElement("span");newNode.innerHTML = text.replace(regExp, `<span style="color: red;">$&</span>`);node.parentNode.replaceChild(newNode, node);} else {const childNodes = node.childNodes;childNodes.forEach((child) => {highLightText(child);});}}highLightText(el);}};
- main.js 中全局注册
import './assets/main.css'
import { createApp } from 'vue'
import App from './App.vue'
import { highLight2 } from './utils/highLight.js'
const app = createApp(App)
app.directive('highlight', highLight2)
app.mount('#app')
- 使用组件(只是简单的使用例子,参考用。)
<script setup>
import {ref} from 'vue';
let search = ref('')
let testData= ref([{id:1, name:'张三'},{id:2, name:'测试'},{id:3, name:'李四'},{id:4, name:'张四'},{id:5, name:'李三'},{id:6, name:'赵四'},{id:7, name:'赵二'},{id:8, name:'唐三'},{id:9, name:'唐五'},
])
let resultData=ref([])function inputFun(){resultData.value = []//使用settimeout 的异步,使得代码执行有点时间差。//感觉不太靠谱setTimeout(() => {resultData.value = testData.value.filter((item) => {return item.name.includes(search.value)})}, 0)
}
</script><template><div><el-input v-model="search" style="width: 240px" placeholder="Please input" @input="inputFun"/><ul> <li v-for="item in resultData" :key="item.id"><span v-highlight="search">{{item.name}}</span></li></ul></div></template>
<style lang="scss" scoped>
div{}
</style>
2-2.页面拖拽
展示动画效果如下:
解释说明:
- 实现效果
- 可以在屏幕中拖拽到任意位置;
- 实现方式:
- 通过
position
定位元素, - 通过鼠标事件,获取鼠标点击位置,获取元素的宽高,元素在屏幕中的位置
- 通过这些数值计算元素的
left
和top
;
- 通过
- 使用场景:浏览器中的智能机器人图标等,独立存在在浏览器中的元素。
- 可优化:
- 对于浏览器上方的判断边界不是很完善。
代码分享:
- draggable.js
function draggable(el, binding) { let startMX,startMY;let startOL,startOT;el.style.cursor = 'move';//给元素帮定鼠标事件el.addEventListener('mousedown', (e) => {startMX = e.clientX;startMY = e.clientY;startOL = el.offsetLeft;startOT = el.offsetTop;document.addEventListener('mousemove', dragMove);document.addEventListener('mouseup', dragEnd);});// 鼠标移动事件,处理鼠标移动位置const dragMove = (e) => {const moveX = e.clientX ;const moveY = e.clientY ;const left = moveX - startMX + startOL;const top = moveY - startMY + startOT;let docH = window.innerHeight;let docW = window.innerWidth;let elW = el.getBoundingClientRect().width;let elH = el.getBoundingClientRect().height;let newLeft = left>0 ? left : 0;let newTop = top>0 ? top : 0;newLeft = left>docW - elW ? docW - elW : left;newTop = top>docH - elH ? docH - elH : top;el.style.left = `${newLeft}px`;el.style.top = `${newTop}px`;};//鼠标事件结束,清除事件const dragEnd = () => {document.removeEventListener('mousemove', dragMove);document.removeEventListener('mouseup', dragEnd);}
}export default {install(app) {app.directive('draggable', {mounted(el, binding) {draggable(el, binding);},updated(el, binding) {draggable(el, binding);},});}
};
- draggable.vue(只是简单的使用例子,参考用。)
<script setup>
</script><template><div class="app"><div class="draggable-box" v-draggable> </div></div>
</template>
<style lang="scss" scoped>
.draggable-box{background: #f00;width: 100px;height: 100px;position: absolute;
}
.app{background: #333;width: 100vw;height: 100vh;position: relative;
}
</style>
2-3.自动聚焦(v2 和 v3)
效果展示:
- vue2自动聚焦
//vue2
Vue.directive('focus', {inserted: function (el) {if (el.focus)el.focus();const input = el.querySelector('input');if (input)input.focus();}
});
- vue3自动聚焦
//vue3
app.directive('focus', {mounted(el) {if (el.focus)el.focus();const input = el.querySelector('input');if (input)input.focus();},
});
3.参考资源
- vue3.js官方网站:https://cn.vuejs.org/
- vue2.js官方网站:https://v2.cn.vuejs.org/
相关文章:

Vue常用自定义指令-积累的魅力【VUE】
前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中,整理了自定义指令部分vue2和vue3 两个版本的区别,有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码,与大家一起分享。…...

LangChain4j第三篇: RAG的简单应用与实践
引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…...
机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴
机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 以跟着菜谱学…...

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法
howler.js 是一个功能强大且易于使用的 JavaScript 音频库,它提供了跨浏览器的音频播放功能,支持多种音频格式,并且具有丰富的 API,可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…...
品鉴JS的魅力之防抖与节流【JS】
前言 小水一波,函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑,在我们的日常开发中,有着一定的地位。 防抖和节流是两种常用的性能优化技术,用于限制某个函数在一定时间内被触发的次数,减少不…...

如何使用patch-package给npm包打补丁
一、背景 在移动应用开发中,轮播是一种很常见的效果,我们项目采用的是RN跨平台技术,RN的轮播我们直接使用的是第三方插件:react-native-snap-carousel。不过,当我们在项目中使用的时候却发现Android和iOS的表现不一致:https://stackoverflow.com/questions/60711611/rea…...

maxkey单点登录系统
github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址: Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara 🗝️MaxK…...

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内
windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内 前言:最近遇到一个需求,我有15个文件夹(可能包含子文件夹) ,目前我有一批文件名称,需要在这15个文件夹中查找出来,并拷贝到一个新的文件夹…...

Notepad++ 下载与安装教程(小白专属)
文章目录 Notepad下载渠道的专业选择1. 官方网站下载(海外用户或网络条件优越者首选)2. 国内优化下载地址(国内用户高效选择) Notepad精细化安装流程解析总结与后续建议 在当前的开发与文本处理工作中,Notepad无疑是一…...

Spring Cloud Gateway 微服务网关实战指南
上篇文章简单介绍了SpringCloud系列OpenFeign的基本用法以及Demo搭建(Spring Cloud实战:OpenFeign远程调用与服务治理-CSDN博客),今天继续讲解下SpringCloud Gateway实战指南!在分享之前继续回顾下本次SpringCloud的专…...

微服务架构实战:Eureka服务注册发现与Ribbon负载均衡详解
微服务架构实战:Eureka服务注册发现与Ribbon负载均衡详解 一 . 服务调用出现的问题二 . EureKa 的作用三 . 服务注册3.1 搭建 EureKaServer① 创建项目 , 引入 spring-cloud-starter-netflix-eureka-server 的依赖② 编写启动类 , 添加 EnableEurekaServer 注解③ 添…...

采用多维计算策略(分子动力学模拟+机器学习),显著提升 α-半乳糖苷酶热稳定性
字数 978,阅读大约需 5 分钟 在工业应用领域,α-半乳糖苷酶在食品加工、动物营养及医疗等方面发挥着重要作用。然而,微生物来源的该酶往往存在热稳定性不足的问题,限制了其在工业场景中的高效应用。近日,来自江南大学的…...

【java】小练习--零钱通
文章目录 前言一、项目开发流程说明二、功能实现2.1 菜单2.2 零钱通明细2.3 零钱通收益2.4 零钱通消费2.5 零钱通退出确认2.6 零钱通金额校验2.7 完整代码 三、零钱通OOP版 前言 本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记,主要…...
旅游信息检索
旅游信息检索 旅游信息检索是系统中实现数据获取和处理的关键环节,负责根据用户输入的目的地城市和出游天数,动态获取并生成高质量的旅游数据。 模块的工作流程分为以下几个阶段:首先,对用户输入的信息进行标准化处理࿰…...
贝叶斯理论
一、贝叶斯理论的核心思想 贝叶斯理论(Bayesian Theory)是一种基于条件概率的统计推断方法,其核心是通过先验知识和新观测数据的结合,动态更新对事件发生概率的估计。它体现了“用数据修正信念”的思想,广泛应用于机器…...

Docker-mongodb
拉取 MongoDB 镜像: docker pull mongo 创建容器并设置用户: 要挂载本地数据目录,请替换此路径: /Users/Allen/Env/AllenDocker/mongodb/data/db docker run -d --name local-mongodb \-e MONGO_INITDB_ROOT_USERNAMEadmin \-e MONGO_INITDB_ROOT_PA…...

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》学习心得
一、引言 在当今数字化营销浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑着市场格局。GenAI 既是一场充满机遇的变革,也是一场潜在风险的挑战。一方面,绝大多数 B2C 营销领导者对 GenAI 赋能营销抱有极高期待,他们看到了 GenAI 在提升时间与成本效率方面的巨大潜…...
[ARM][汇编] 02.ARM 汇编常用简单指令
目录 1.数据传输指令 MRS - Move from Status Register 指令用途 指令语法 代码示例 读取 CPSR 到通用寄存器 在异常处理程序中读取 SPSR 使用场景 MSR - Move to Status Register 指令语法 使用场景 示例代码 改变处理器模式为管理模式 设置条件标志位 异常处理…...

达梦数据库-学习-22-库级物理备份恢复(超详细版)
目录 一、环境信息 二、说点什么 三、概念 1、备份恢复 2、重做日志 3、归档日志 4、LSN 5、检查点 四、语法 1、BACKUP DATABASE 2、DMRMAN RESTORE DATABASE 3、DMRMAN RECOVER DATABASE 4、DMRMAN UPDATE DB_MAGIC 五、实验 1、开归档 (1…...

python网络爬虫的基本使用
各位帅哥美女点点关注,有关注才有动力啊 网络爬虫 引言 我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP、JAVA、C#、C、Python。 为什么Python的爬虫技术会…...

AI Agent开发第74课-解构AI伪需求的魔幻现实主义
开篇 🚀在之前的系列中我们狂炫了AI Agent的各种高端操作(向量数据库联动、多模态感知、动态工作流等…),仿佛每个程序员都能用LLM魔法点石成金✨。 但今天咱们要泼一盆透心凉的冷水——当企业把AI当成万能胶水强行粘合所有需求时,连电风扇都能被玩出量子纠缠的魔幻现实…...

【卫星通信】通信卫星链路预算计算及其在3GPP NTN中的应用
引言 卫星通信是现代信息传播的重要手段,广泛应用于电信、广播、气象监测、导航等领域。卫星链路预算计算是设计和优化卫星通信系统的重要步骤,它帮助工程师评估信号在传输过程中的衰减和增益,从而确保系统在预定条件下可靠地工作。 1. 链路…...
HTTP请求方法:GET与POST的使用场景解析
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 HTTP协议定义了多种请求方法,其中GET和POST是最常用的两种。它们在Web开发中承担着不同的角色,理解其核心差异和使用场景是构建高效、…...
第十五章:数据治理之数据目录:摸清家底,建立三大数据目录
在上一篇随想篇中,介绍了数据资源资产化的过程,理解了数据资源、数据资产的区别。这些对于本章的介绍会有帮助,如果仍有疑问可以看上一篇【数据资源到数据资产的华丽转身 ——从“沉睡的石油”到“流动的黄金”】。 说到本章要介绍的数据目录…...

c++命名空间的作用及命名改编
c命名空间的作用及命名改编 命名空间 namespace的作用: std::命名空间,命名空间(namespace)是 C 中用于解决标识符命名冲突问题的机制。在大型程序开发中,不同模块可能会使用相同名称的变量、函数或类等标识符&…...
Go核心特性与并发编程
Go核心特性与并发编程 1. 结构体与方法(扩展) 高级结构体特性 // 嵌套结构体与匿名字段 type Employee struct {Person // 匿名嵌入Department stringsalary float64 // 私有字段 }// 构造函数模式 func NewPerson(name string, age int) *Pe…...

echarts实现项目进度甘特图
描述 echarts并无甘特图配置项,我们可以使用柱状图模拟,具体配置项如下,可以在echarts直接运行 var option {backgroundColor: "#fff",legend: {data: ["计划时间","实际时间"],align: "right",…...
Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中
Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中 在 Flutter 中,build 方法被设计在 StatefulWidget 的 State 类中而非 StatefulWidget 类本身,这种设计基于几个重要的架构原则和实际考量: 1. 核心设计原因 1.1 生命周期管理…...
C#串口打印机:控制类开发与实战
C#串口打印机:控制类开发与实战 一、引言 在嵌入式设备、POS 终端、工业控制等场景中,串口打印机因其稳定的通信性能和广泛的兼容性,仍是重要的数据输出设备。本文基于 C# 语言,深度解析一个完整的串口打印机控制类Printer&…...

2025深圳国际无人机展深度解析:看点、厂商与创新亮点
2025深圳国际无人机展深度解析:看点、厂商与创新亮点 1.背景2.核心看点:技术突破与场景创新2.1 eVTOL(飞行汽车)的规模化展示2.2 智能无人机与无人值守平台2.3 新材料与核心零部件革新2.4 动态演示与赛事活动 3.头部无人机厂商4.核…...