Vue 组件 - 指令

article/2025/9/5 4:39:52

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令

 

目录

指令写法

自定义指令

简单封装指令

指令传递字符串

update事件

指令应用

指令实现轮播

指令函数简写

指令函数列表

bind

inserted

update

componentUpdated

unbind

Vue3指令轮播

nextick

总结


指令写法

指令:为了操作底层dom。

实际应用:可以通过指令知道什么时候dom创建完成,从而进行依赖dom的库初始化工作。

自定义指令

对普通dom元素进行底层操作。

编写一个输入框,当被绑定的元素插入到dom中时,

输入框获取焦点。

示例如下:

<div id="box"><input v-focus name="name" />
</div>
<script src="../lib/vue.js"></script>
<script>// 注册一个全局自定义指令 'v-focus'Vue.directive("focus", {// 当被绑定的元素插入到dom中时inserted:function(el) {// 聚焦元素el.focus()}})new Vue({el:"#box"})
</script>

 

简单封装指令

做一个简单的指令封装。

示例如下:

<div id="box"><div v-hello>你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el) {console.log("inserted", el)el.style.background = "red"}})new Vue({el:"#box"})
</script>

 

指令传递字符串

如果在参数中不包含单引符号,则识别为状态,需要提前定义好。

示例如下:

<div id="box"><div v-hello=" 'yellow'">你好 vue</div><div v-hello=" 'blue'">你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el, binging) {console.log("inserted", binging)el.style.background = binging.value}})new Vue({el:"#box"})
</script>

inserted事件,是在第一次插入到父节点时触发。

update事件

可以在update触发事件中修改值进行指令赋值。

示例如下:

<div id="box"><div v-hello=" 'yellow'">你好 vue</div><div v-hello=" 'blue'">你好 vue</div><div v-hello="whichColor">你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el, binging) {console.log("inserted", binging)el.style.background = binging.value},update(el, binging) {console.log("update")el.style.background = binging.value}})let vm = new Vue({el:"#box",data : {whichColor: "red"}})
</script>

效果:

指令应用

指令实现轮播

使用指令来完成轮播。

因为不知道什么时候数据什么时候插入的,直接绑定一个指令。

给指令传递对象参数。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="../lib/swiper-bundle.css"><style>.swiper-container {width: 600px;height: 300px;}</style>
</head>
<body>
<div id="box"><header>导航</header><div class="swiper-container demo"><div class="swiper-wrapper"><div class="swiper-slide" v-for="(data, index) in datalist" :key="data" v-swiper="{index:index,length:datalist.length}"><img :src="data" alt=""/></div></div><!-- 如果需要分页器 --><div class="swiper-pagination"></div></div><footer>底部内容</footer>
</div>
<script src="../lib/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>Vue.directive("swiper", {// 指令的生命周期inserted(el, binging) {let {index,length} = binging.valueif (index === length - 1) {new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})}}})new Vue({el: '#box',data: {datalist:[],},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)}})
</script>
</body>
</html>

 

指令函数简写

这种方式,更新和创建都会触发,如果两种触发都是同样的处理可以使用简写方式。

示例如下:

Vue.directive("hello", ()=> {console.log("创建或者更新都会执行")
})

 

指令函数列表

bind

只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted

被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

update

所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可以发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。

componentUpdated

指令所在组件的VNode及其子VNode全部更新后调用。

unbind

只调用一次,指令与元素解绑时调用。

Vue3指令轮播

使用app.directive()定义指令

生命周期需要更换inserted更换为mounted

示例如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="../lib/swiper-bundle.css"><style>.swiper-container {width: 600px;height: 300px;}</style>
</head>
<body>
<div id="box"><header>导航</header><div class="swiper-container demo"><div class="swiper-wrapper"><div class="swiper-slide" v-for="(data, index) in datalist" :key="data" v-swiper="{index:index,length:datalist.length}"><img :src="data" alt=""/></div></div><!-- 如果需要分页器 --><div class="swiper-pagination"></div></div><footer>底部内容</footer>
</div>
<script src="../lib/swiper-bundle.js"></script>
<script src="../lib/vue.next.js"></script>
<script>let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)}}let app = Vue.createApp(obj)// app.component()// app.component()app.directive("swiper", {// 指令的生命周期mounted(el, binging) {let {index,length} = binging.valueif(index === length - 1) {new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})}}})app.mount("#box")
</script>
</body>
</html>

 

nextick

当数据更新到dom中时,会触发一次性的监听事件。

示例如下:

let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)this.$nextTick(() => {console.log("比updated执行的都晚,而且只执行一次")})}
}

可以在tick中处理实例化,会在数据源更新后,触发一次实例化。

示例如下:

let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)this.$nextTick(() => {console.log("比updated执行的都晚,而且只执行一次")new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})})}
}

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令介绍及应用示例


http://www.hkcw.cn/article/PeuIBLDpVn.shtml

相关文章

在Mathematica中求解带阻尼的波方程

考察偏微分方程 和初边值条件 这里主要示意一下&#xff0c;这个方程如何用Mathematica来求解以及在使用不同解法的时候&#xff0c;会遇到什么问题。 方法一&#xff1a;不额外附加边界条件 ClearAll[u, x, t, a, b, c, w, n];c 1; n 1; a 1; b 1; w 1;pde {D[u[t, x]…

Linux目录结构与命令基础与ls命令

目录结构 linux的目录结构是一个树形结构&#xff0c;只有一个根目录&#xff1a;/&#xff0c;所有文件都在他下面。 而win有多个根目录&#xff0c;每一个盘符都是一个根目录 在linux系统中&#xff0c;路径的层级关系使用“/”表示。而一般来说&#xff0c;开头的 /表示的…

13 接口自动化-框架封装之 csv 数据驱动封装和日志

文章目录 一、框架封装规则总结二、框架代码简单实现项目框架预览csv_util.py - 处理 csv 数据logger_util.py - 处理日志requests_util.py - 将请求封装在同一个方法中yaml_util.py - 处理 yaml 数据get_token.yml 文件-采用了csv数据驱动get_token.csv 文件get_token_error.c…

1Panel v2 首发体验(alpha)

前言 1Panel v2 也是期待已久了&#xff0c;今天来试试&#xff0c;这是一个 alpha 版本&#xff0c;不代表最终正式版品质&#x1f92a;。 体验 登录界面 登录页面的变化还是比较大的&#xff0c;不再像 v1 时挂几个大字&#xff0c;在视觉和交互体验上都有显著提升。 新版…

SAR ADC 比较器噪声分析(一)

SAR ADC的比较器是非常重要的模块,需要仔细设计。主要考虑比较器的以下指标: 1)失调电压 2)输入共模范围 3)比较器精度 4)传输延时 5)噪声 6)功耗 这里主要讲一下noise。 上图比较器的噪声分析,详情见本专栏中的《SAR ADC 的噪声考虑》的比较器噪声的相关描述。比较器噪声…

【大模型/MCP】MCP简介

一句话总结 如果你打算让 LLM 像人一样“随手”调用脚本、数据库、搜索引擎或 CI/CD 流水线&#xff0c;而又不想为每个工具分别写 REST 插件或轮询接口&#xff0c;那么把它们包进 MCP 服务器是当前最省心、延迟最低、可复用最高的做法——正因如此 OpenAI、Google DeepMind、…

日常--OBS+mediamtx实现本地RTMP推流环境搭建(详细图文)

文章目录 一&#xff0e;前言二&#xff0e;介绍1.OBS2.mediamtx 三&#xff0e;环境搭建1.安装1.安装mediamtx2.安装OBS 2.配置OBS3.开启推流4.测试拉流 四&#xff0e;总结 一&#xff0e;前言 最近博主更新了一些和实时摄像头内容视觉项目&#xff0c;有好多小伙伴私信我问…

2024 CKA模拟系统制作 | Step-By-Step | 12、创建多容器Pod

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. 多容器 Pod 的理解 2. YAML 配置规范 3. 镜像版本控制 三、考点详细讲解 1. 多容器 Pod 的工作原理 2. 容器端口冲突处理 3. 资源隔离机制 四、实验环境搭建步骤 总结 免费获取题库配套 CKA_v…

江科大UART串口通讯hal库实现

hal库相关库函数 初始化结构体 typedef struct {uint32_t BaudRate; /*波特率设置*/uint32_t WordLength; /*字长设置*/uint32_t StopBits; /*停止位设置 */uint32_t Parity; /*奇偶校验位设置*/uint32…

基于本地知识库的政务问答智能体

1.项目背景&#xff1a; 近年来&#xff0c;国家大力推进 “数字政府”“智慧政务” 建设&#xff0c;《“十四五” 数字经济发展规划》《关于加强数字政府建设的指导意见》等政策文件明确提出&#xff0c;要运用新一代信息技术优化政务服务流程&#xff0c;推动政务服务从 “…

python面向对象

可调用对象的范围包括&#xff1a;用户定义的函数&#xff0c;匿名函数&#xff0c;内置函数和内置方法&#xff0c;类&#xff0c;在类中定义的方法&#xff0c;生成器函数&#xff0c;如果类实现了_call 方法&#xff0c;那么类的实例对象也是可调用对象。 1 变量 1.1 类属性…

纯html,js创建一个类似excel的表格

后台是php,表中数据可编辑,可删除,可提交到数据库 <!DOCTYPE html> <html> <head><meta charset="utf-8"><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #fff;}.toolbar {margin-bottom: 10px;disp…

【测试】设计测试⽤例方法

设计测试⽤例方法 等价类 依据需求将输入&#xff08;特殊情况下会考虑输出&#xff09;划分为 若⼲个等价类 &#xff0c;从等价类中 选出⼀个测试⽤例 &#xff0c;如果 这个测试⽤例测试通过&#xff0c;则 认为所代表的等价类测试通过 &#xff0c;这样就可以⽤较少的测试…

摩尔信使MThings无法生成机器码的解决方法

在使用摩尔信使MThings的过程中&#xff0c;部分用户&#xff08;Win11操作系统&#xff09;可能会遇到无法生成机器码的问题&#xff0c;这将影响软件的正常授权。机器码是软件授权管理的关键环节&#xff0c;用于确保授权证书与特定设备的绑定。 解决步骤&#xff1a; 1、按 …

设计师如何搭建自己的素材库?

在数字化设计时代&#xff0c;设计资产已成为团队核心竞争力的重要组成部分。无论是UI组件、品牌视觉规范&#xff0c;还是交互原型和历史版本文件&#xff0c;这些资源的高效管理直接影响着设计质量和团队协作效率。然而&#xff0c;许多设计师仍深陷“文件混乱-重复劳动-版本…

AU6815集成音频DSP的2x25W数字型ClaSS D音频功率放大器(替代TAS5805)

1.特性 ● 输出配置 - 立体声 2.0: 2x25W (8Ω,21V,THD N 1%) - 立体声 2.0: 2x23W (6Ω, 18V,THD N 1%) ● 供电电压范围 - PVDD:4.5V-21V - DVDD: 1.8V 或者 3.3V ● 静态功耗 - 31.5mA at PVDD12V,BD - 18.5mA at PVDD12V,1SPW ● 音频性能指标 - Noise: ≤38uVrms - TH…

国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路

万翼斗拱在国产BIM领域迈出重要一步&#xff0c;凭借二三维一体化、参数化建模及AI辅助设计等功能形成差异化竞争力&#xff0c;在住宅设计场景中展现效率优势&#xff0c;但与国际主流软件相比&#xff0c;在功能完整性、性能稳定性和生态成熟度上仍有显著差距&#xff0c;需通…

企业内训系统源码开发详解:直播+录播+考试的混合式学习平台搭建

在企业数字化转型的大潮中&#xff0c;员工培训早已不再是传统教室中的一场场“走过场”&#xff0c;而是通过技术驱动的“系统化能力提升”。尤其在知识更新换代加速、竞争压力日益激烈的背景下&#xff0c;企业越来越倾向于建设自主可控、功能灵活、支持多种学习形态的内训平…

HbuilderX设置禁止import 引入模块换行

设置前效果&#xff1a; 设置&#xff1a;工具→插件配置→打开文件jsbeautifyrc.js进行配置 // 修改这个配置项 "brace_style": "collapse,preserve-inline", 配置后效果&#xff1a;

小白的进阶之路系列之七----人工智能从初步到精通pytorch自动微分优化以及载入和保存模型

本文将介绍Pytorch的以下内容 自动微分函数 优化 模型保存和载入 好了,我们首先介绍一下关于微分的内容。 在训练神经网络时,最常用的算法是反向传播算法。在该算法中,根据损失函数相对于给定参数的梯度来调整参数(模型权重)。 为了计算这些梯度,PyTorch有一个内置…