第三十九篇 自定义指令 - directive

news/2024/4/17 3:20:22/文章来源:https://blog.csdn.net/weixin_52203618/article/details/127867548

         前面讲了关于在Vue中如何来进行封装swiper组件的内容,本篇内容讲到使自定义组件,讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容,那么什么是自定义指令,在前面的内容讲过了好些常用的指令,如 v-modle、v-bind、v-show、v-if、v-for、v-else等等相关的指令来说就已经基本够用,而为什么出现自定义指令只再一些情况之下需要对DOM元素进行底层操作,那么就能够将其封装在指令当中,这样一来在使用的话就看不到对DOM元素进行底层操作,说到底自定义指令的目的就是为了对DOM元素进行底层操作;将底层操作封装到指令当中,其实是能够达到复用效果。下面来进行一个对自定义指令的学习使用:

全局自定义指令 - directive使用

 通过一个简单的例子来演示:

<div id="app"><div v-msg>温馨提示</div>
</div>
<script>// 自定义指令 "v-msg"Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el){console.log("绑定当前指令的标签插入父节点就会执行",el)}})new Vue({el:'#app',})
</script>

        编写自定义指令"v-msg",inserted是指令的生命周期之一,前面讲到的是组件的八个生命周期,inserted是什么呢?就是 v-msg 绑定的标签插入到DOM节点上就会执行 inserted 指令生命周期,那么上面讲到使用自定义指令其实就是就是要操作底层的DOM,那么打印 inserted(el) 中的第一个参数,可以通过效果看到可以访问到原生的DOM,自定义指令的本意其实也是为了让你能够访问原生DOM,解决在某些特性情况下你需要对底层DOM的操作;

        下面来进行inserted时对绑定的内容做改变:当绑有 v-msg 指令插入父节点的时候它会出现一个边框的效果(1px solid black);

<script>// 自定义指令 "v-msg"Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el){console.log("绑定当前指令的标签插入父节点就会执行",el)el.style.border = "1px solid black"}})new Vue({el:'#app',})
</script>

        那么在之前使用的 v-if 、v-show 等的一些指令能够通过传一个属性来控制,那么自定义指令 v-msg 想通过传值来更改效果行不行呢?测试一下:

<div id="app"><div v-msg="red">温馨提示</div>
</div>

 控制台会出现报错:

[Vue warn]: Property or method "red" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. 

        "red"未在实例上定义,通过初始化属性,确保此属性在 data 选项中或对于基于类的组件是反应性的。 

         那么在此需要知道一个问题,使用v-if,v-show的这些传值是当成一个变量来进行使用的,那么在此的 red 是通过字符串的形式,那么就该使用一个引号;使用 inserted 的第二个参数 binding ,也即是绑定的内容,下面来看一下:

<div id="app"><div v-msg=" 'red' ">温馨提示</div>
</div>
Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el,binding){console.log(binding);console.log("binding.value:",binding.value);
...

         通过打印 binding 可以看到关于组件的内容,通过binding。binding.value 能够获取到绑定的值字符串 red,这样就可以来进行操作;

<div id="app"><div v-msg="'red'">温馨提示</div>
</div>
<script>
Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el,binding){el.style.border = "1px solid " + binding.value}})new Vue({el:'#app'})
</script>

        v-msg 传过去一个字符串red值,那么对应绑定v-msg的标签会有一个像素的实线红色边框;来看测试效果:

        那么如果想附上一个蓝色或是绿色的边框,可以通过v-msg自定义指令然后以字符串的形式传入颜色:

<div v-msg="'blue'">温馨提示</div>
<div v-msg="'green'">温馨提示</div>

        此时你又不想在 v-msg 当中把值写固定了,可以通过一个data定义一个变量:

<div id="app"><div v-msg="mycolor">温馨提示</div>
</div>
<script>
Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el,binding){el.style.border = "1px solid " + binding.value}})var vm = new Vue({el:'#app',data:{mycolor:"red"}})
</script>

        这样编写可以显示出来,但有什么问题呢?我通过控制台输入这样一个命令来更改 mycolor 是否会得到更新呢?

        怎么还是红色呢?不应该是蓝色吗?inserted 是我们插入父节点的时候进行触发的,而对数据的更新并没有,此时data数据是最新的,但DOM节点的数据仍然是旧数据,那么就需要在指令中的update周期进行数据更新;下面看编写代码和测试效果:

Vue.directive("msg",{// 指令生命周期之一 insertedinserted(el,binding){el.style.border = "1px solid " + binding.value},update(el,binding){el.style.border = "1px solid " + binding.value}})

        以上就是自定义的一个指令,虽然实际不会做这样一个比较无趣的指令,但通过这个例子能够对自定义指令有着一定的认识和了解;


        下面进一步的观察代码会发现一个问题,指令的生命周期 inserted 和update 中的内容一样,inserted 是内容插入父节点是发生,而update是数据更新发生,刚好这个自定义指令也确实需要这么写,但是既然这两个内容都是一样的,那么可以换一种方式,将它编写成一个函数,在创建和更新的时候都会被调用执行的;下面来看一下这种方式是怎样:

Vue.directive("msg",function(el,binding){el.style.border = "1px solid " + binding.value
})

测试效果:


局部自定义指令 - directives使用

        上面是在全局当中来使用自定义指令,那么如果在封装组件的时候,仅为了组件的使用需要用局部的自定义指令,那么在组件中如何让来用局部的自定义指令呢? —— directives

1. 编写代码

Vue.component("child",{template:`<div><input type="text" v-focus /><button>搜索</button></div>`,directives:{// 指令名称focus:{inserted:function(el){el.focus()}}}
})

        通过设置 directives 来进行注册局部指令,这个指令名称是focus,当input标签绑定 v-focus 时在组件插入到父节点当中时会自动获取焦点;

2. 测试效果

        那么通过以上自定义指令的一个认识学习,为什么说自定义指令其实就是操作底层DOM ,还记得前面讲的swiper吗?为什么在Vue中会有初始化过早之类的一些问题,在其他像jquery使用就不需要担心这些问题,在Vue当中非常依赖DOM,需要去注意它会在什么时候创建完成,先前从mounted生命周期尝试再转到updated生命周期在回到mounted生命周期,通过设置key或者v-if指令一点一点去尝试才知道,那么指令的目的也就并非是一定要去操作DOM,而是它知道什么时候DOM刚刚创建完成,知道这个,我们再一次踏上了封装swiper组件的一个路程。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】环境基础开发工具使用

1.vim编辑器 vim中最常用的是三种模式&#xff1a;命令模式&#xff0c;底行模式&#xff0c;插入模式。 命令模式(Normal mode)命令模式是我们第一次vim打开文件的样子&#xff08;默认模式&#xff09;&#xff0c;这里控制屏幕光标的移动&#xff0c;字符、字或行的删除&…

考CISAW的N个理由!

随着信息科技的飞速发展&#xff0c;互联网的普及&#xff0c;面对信息安全的严峻局势&#xff0c;网络信息安全显得尤为重要&#xff0c;同时近些年来&#xff0c;国家也相继出台一些政策&#xff0c;并推出一些国家认证的资格证书&#xff0c;CISAW认证就是专门针对信息安全保…

DPDK代码目录结构

DPDK功能结构 DPDK工程目录内容 dpdk-stable-18.11.11]# ls app buildtools devtools drivers GNUmakefile lib MAINTAINERS meson.build mk README usertools build config doc examples kernel license Makefile meson_opt…

使用React.ts创建一个密码生成器的简单示例

目录密码生成器DemoFeature知识点React TypeScript —— Function Components为元素(::before/::after)绑定点击事件React如何正确定义对象数组在React中设置复选框check属性三目运算符实现React动态绑定class和style参考资料密码生成器Demo 使用密码生成器工具创建随机密码。P…

GIT技巧

目录 基础命令 commit 、branch merge rebase 高级特性 自由修改提交树 cherry-pick rebase 远程仓库命令 基础命令 commit 、branch Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是把整个目录复制&#xff0c;然后再粘贴一样…

流媒体传输 - HLS 协议

HLS 全称是 HTTP Live Streaming&#xff0c;是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议&#xff0c;用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。 概述 原理介绍 通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件&#xff…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Python的10个编程技巧,你不一定都知道

文末有Python资料下载 1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换&#xff08;变量值&#xff09;的方法&#xff0c;请参见下面的示例&#xff1a; 赋值的右侧形成了一个新的元组&#xff0c;左侧立即解析&#xff08;unpack&#xff09;那个&…

leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)

这道题标记为简单题是正常的&#xff0c;因为当你想到0或者1开头的时候就已经结束了看看我的分析 那么知道这个信息之后就很简单了&#xff0c;加上我们的位运算符号^作为标记即可&#xff0c;大家看看代码实现 1758. 生成交替二进制字符串的最少操作数 难度简单88收藏分享切换…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别&#xff1f; 如果使用 UNION&#xff0c;会在表链接后筛选掉重复的记录行如果使用 UNION ALL&#xff0c;不会合并重复的记录行从效率上说&#xff0c;UNION ALL 要比 UNION 快很多&#xff0c;如果合并没有刻意要删除重复行&#xff0c;那么就使…

Java基于springboot+vue的摄影作品展示交流系统 计算机毕业设计

随着时代的发展&#xff0c;人们的精神世界也在不断的丰富&#xff0c;尤其是在当下电子设备发展迅速的背景下&#xff0c;人们通过数码相机或者手机随后就可以拍下每一个美丽的瞬间&#xff0c;但是人们更希望将这些摄影作品传到网上和更多的人进行分享&#xff0c;同时也希望…

电脑键盘功能基础知识,快速入门,抓住这份详细教程

在互联网生活发达的今天&#xff0c;电脑已经成为了学习工作的必备工具。而用来操作电脑的关键&#xff0c;就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编&#xff0c;希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不&#xff0c;小编应大家要求&#…

用匠心创造可期未来!与广州流辰信息科技一起携手创佳绩!

当今社会世界经济一体化趋势逐渐明朗化&#xff0c;竞争也愈发激烈&#xff0c;同时&#xff0c;这也是一个机遇与挑战并存的开放社会。在机遇面前&#xff0c;作为企业&#xff0c;要紧紧抓住机遇&#xff0c;顺势而为&#xff0c;创造辉煌佳绩&#xff1b;在挑战面前&#xf…

嵌入式 C语言/C++ 常见笔试、面试题 难疑点汇总(经典100道)

#pragma comment。将一个注释记录放置到对象文件或可执行文件中。 #pragma pack。用来改变编译器的字节对齐方式。 #pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数&#xff0c;函数将放置在默认代码段.text中 #pragma once。保证所在文件只…

MySQL软件常见操作

1登录MySQL 登录&#xff0c;如果你配置了环境变量就可以winr&#xff0c;在运行框输入cmd&#xff0c;输入登录命令 第一种&#xff1a;直接输入密码 mysql -uroot -p(你的密码没有有括号) 第二种不直接输入密码 mysql -uroot -p 前面两种都是localhost登录 下面是完整版 m…

slam定位学习笔记(七)-g2o学习

主要学习的是这篇文章&#xff0c;但大佬并没有在文章里面仔细的讲g2o&#xff0c;所以我在网上找了这几篇介绍g2o的文章&#xff0c;讲的十分详细&#xff0c;对入门十分友好&#xff1a;文章一、文章二、文章三&#xff0c;这三篇都是一个作者写的&#xff0c;主要是针对编程…

MATLAB数据导入

MATLAB数据导入 在编写一个程序时&#xff0c;经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。 MATLAB中导入数据的方式有两种&#xff0c;分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第…

广播实现强制下线功能

实现强制下线功能 强制下线应该是一个比较常用的功能,比如QQ在比的地方被登陆了,就会强制比被挤下线.强制下线的功能还是比较简单的,只需要在界面上弹出一个框,告知用户无法再进行任何操作即可.只能点击确定然后跳转至登录界面.强制下线功能需要关闭所有的Activity,然后返回到…

微服务框架 SpringCloud微服务架构 4 Ribbon 4.3 饥饿加载

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构4 Ribbon4.3 饥饿加载4.3.1 饥饿加载4.3.2 总结4 Ribbon 4.3 饥饿加载 4…

【毕业设计】深度学习车辆颜色识别检测系统 - python opencv YOLOv5

文章目录1 前言2 实现效果3 CNN卷积神经网络4 Yolov55 数据集处理及模型训练6 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设…