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

news2024/11/25 18:47:23

         前面讲了关于在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",{
        // 指令生命周期之一 inserted
        inserted(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",{
        // 指令生命周期之一 inserted
        inserted(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",{
    // 指令生命周期之一 inserted
    inserted(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",{
    // 指令生命周期之一 inserted
    inserted(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",{
    // 指令生命周期之一 inserted
    inserted(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",{
    // 指令生命周期之一 inserted
    inserted(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.coloradmin.cn/o/46915.html

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

相关文章

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 对于前端人员来讲&#xff0c;最令人头疼的应该就是页面性能了&#xff0c;当用户在访问一个页面时&#xff0c;总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢&#xff0c;你…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…

Redis与数据库的爱恨纠葛

Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 早期数据库只要有数据库的操作---增--删--改--查 当用户量特别多的情况下&#xff0c;数据库的数量一定是跟不上用户的数量&#xff0c;对数据库来说是特别繁忙的 看着每天都累趴下…

String_JavaScript

String_JavaScript 学习路线&#xff1a;JavaScript基础语法&#xff08;输出语句&#xff09;->JavaScript基础语法&#xff08;变量&#xff09;->JavaScript基础语法&#xff08;数据类型&#xff09;->JavaScript基础语法&#xff08;运算符&#xff09;->Jav…

海外推广运营的技巧汇总

海外电商运营推广&#xff1f;做海外电商&#xff0c;重点在于运营推广。如果运营推广能做好&#xff0c;那么在行业内分一杯羹并不难。但问题是&#xff0c;在运营推广上&#xff0c;很难做海外电商。 这年头&#xff0c;相信大家都知道海外电商出问题了。很多人的账号都被亚…

动态链接库dll详解

动态链接库概述 DLL就是整个Windows操作系统的基础。动态链接库不能直接运行&#xff0c;也不能接收消息他们是一些独立的文件。 Windows API中的所有函数都包含在DLL中。 其中有三个最重要的DLL kernel32.dll&#xff0c;它包含用于管理内存、线程和进程的各个函数&#xff1b…

[附源码]SSM计算机毕业设计学生实习管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

超详细的商业智能BI知识分享,值得收藏

在数据为王的时代&#xff0c;获取数据和处理数据&#xff0c;成为企业必备的生存手段。哪个企业能在数据信息中汲取到更多的有效价值&#xff0c;就能抢占先机&#xff0c;获得市场的主动权。数据分析将不再是专业技术人员或数据分析师的专利&#xff0c;商业智能 BI 可以帮助…

华为机试 - 最大股票收益

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 假设知道某段连续时间内股票价格&#xff0c;计算通过买入卖出可获得的最大收益。 输入一个大小为 n 的数 price(p1,p2,p3,p4…….pn),pi 是第i天的股票价格。 pi 的格式为股票价格(非负整型)加上货…

基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操

在数据建模流程中&#xff0c;都会涉及一个样本特征的相关性的分析&#xff0c;这个是建模流程中重要一环。通过量化特征字段之间的相关程度&#xff0c;可以将其作为一个重要信息维度&#xff0c;便于我们对模型训练的特征变量池进行有效筛选&#xff0c;不仅有简化模型且保证…

NLTK下载使用问题

一开始想要执行如下语句&#xff0c;结果运行不了 from textblob import TextBlob text Today is a beautiful day. Tomorrow looks like bad weather. blob TextBlob(text) print(blob) print(-*10) print(blob.sentences)原因是没有下载NLTK的语料库&#xff0c;调用如下语…

【创建VUE3新项目】从零开始如何创建一个干净的vue3项目【基于前端详细介绍】

【写在前面】基于安装完node和npm基础上来实现的&#xff0c;没安装的可以看我之前的文章&#xff0c;如何验证呢&#xff1f;npm -v / node -v 两个命令行解决&#xff01; 一、创建文件&#xff08;脚手架安装&#xff09; 此处值得注意的是不能包括大写字母&#xff0c;不…

图库 | 图计算的适用场景有哪些?

图计算适用的场景非常广泛。在其肇始的早期阶段&#xff0c;图计算仅限于学术界以及工业界资深的研究机构内部&#xff0c;随着计算机体系架构的发展&#xff0c;图计算也在更广泛的行业和场景中得到应用。按照时间维度我们大体可以把图计算的发展及适用范围分为如下几个阶段&a…

微服务框架 SpringCloud微服务架构 5 Nacos 5.1 认识和安装Nacos

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.1 认识和安装Nacos5.1.1 认识Nacos5.1.2 安装Nacos5 Nacos 5.1 …

ARM架构与编程 · 基于IMX6ULL

一、嵌入式系统硬件介绍 cpu RAM&#xff08;内存&#xff09; FALSH 集成&#xff08;flash存储设备&#xff09; MCU/单片机 AP/ MPU 进化之后可以外接内存和存储设备,跑复杂的操作系统&#xff0c;比如手机 cpu一上电就会执行程序&#xff0c;程序存放在片内的ROM中&…

Apollo 应用与源码分析:Monitor监控-软件监控-时间延迟监控

目录 代码 分析 RunOnce 函数分析 UpdateState函数分析 发送时间延迟报告函数分析 备注 代码 class LatencyMonitor : public RecurrentRunner {public:LatencyMonitor();void RunOnce(const double current_time) override;bool GetFrequency(const std::string& ch…

原型设计模式

一、原型模式 1、定义 原型模式&#xff08;Prototype Pattern&#xff09;指原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象&#xff0c;属于创建型设计模式。 原型模式的核心在于复制原型对象。 2、结构 &#xff08;1&#xff09;模式的结构 …

doris 动态分区

添加分区 ALTER TABLE v2x_olap_database.government_car ADD PARTITION p20221203 VALUES LESS THAN ("2022-12-04");动态分区表不能添加分区&#xff0c;需要转为手动分区表 查看分区 show paritions from <表名>删除分区 alter table <表名> dro…

[附源码]Python计算机毕业设计SSM隆庆祥企业服装销售管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

短信的信令过程

目录 1 短消息的信息流程&#xff1a; 1.1消息一次成功发送时的情况MO上行-MT下行 方式&#xff1a;1&#xff0e; MO&#xff08;主叫移动用户发给sp短消息中心&#xff09;编辑好短消息&#xff0c;键入发送号码&#xff08;被叫移动用户号码&#xff09;&#xff0c;按发送…