Vue2基础 14:自定义指令

自定义指令

  • 1 函数式
    • 1.1 案例--v-text放大10倍
  • 2 对象式
    • 2.1 案例--v-fbind默认获取焦点(函数式)
    • 2.2 案例--v-fbind默认获取焦点(对象式)
  • 3 自定义指令容易犯的错
  • 4 全局指令写法(参考过滤器写法):

1 函数式

1.1 案例–v-text放大10倍

<body><div id="root"><h2>当前的n值是:<span v-text="n"></span></h2><h2>放大10倍的n值是:<span v-big="n"></span></h2><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">new Vue({el:'#root',data:{n:1,},// --------定义一个全新的配置项----------directives:{//big:function(){} 简写如下big(element,binding ){element.innerText = binding.value * 10}//big函数被调用的情况://1.指令与元素成功绑定时(初次)//2.指令所在的模板(div id ="root")重新解析时}})
</script>

innerText: 返回或设置元素中的纯文本内容,只适用于IE/Chrome

  • big函数收到的是两个参数:第一个是真实DOM
  1. 判断方法一
    big(a,b){ console.dir(a) }
    控制台输出了真实DOM身上所有的属性和方法
    在控制台的输出

补充:

  1. console.dir()console.log()的区别
  2. MDN上console:dir() 静态方法的介绍
  1. 判断方法二
    big(a,b){ console.log(a instanceof HTMLElement) }
    检测a是不是HTMLElement的实例,输出为true

MDN上instanceof的定义instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
即:
在左边的检测对象的原型链上面查找右边的构造函数的prototype属性是否出现,这个过程会沿着原型链一直找,直到找到原型链的最顶端Object.prototype还没找到,那就只能返回null了,说明该对象不是这个构造函数的实例.

  • big函数收到的是两个参数:第二个是个对象,且含有指令后面代数式的值、指令的名字、使用时指令的名字
    console.log(b)

2 对象式

2.1 案例–v-fbind默认获取焦点(函数式)

先通过案例来看一下,函数式写法会有什么问题。

<body><div id="root"><h2>当前的n值是:<span v-text="n"></span></h2><input type="text" v-fbind:value="n"><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">new Vue({el:'#root',data:{n:1,},//--------定义一个全新的配置项-----------directives:{fbind(element,binding ){element.value = binding.valueelement.focus()}}})
</script>

存在问题:
运行后没有获取焦点,点击按钮才有焦点。
原因:

  1. 按照顺序 指令与元素绑定页面编译 之前。
  2. 那么函数的第一次调用是指令与元素成功绑定时,是在页面上呈现input之前。
  3. 但是模板是经过vue编译才放在页面上的,绑定在编译之前,而在input出现在页面之前是无法获取焦点的。

点击按钮,n值修改,模板重新解析,重新调用指令fbind,现在input元素已在页面上,所以获取焦点。

此时fbind指令是函数形式,调用只存在以下两个时机:

  1. 指令与元素成功绑定时(初次)
  2. 指令所在的模板重新解析时

区分: span.innerText | input.value

2.2 案例–v-fbind默认获取焦点(对象式)

<body><div id="root"><h2>当前的n值是:<span v-text="n"></span></h2><input type="text" v-fbind:value="n"><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">new Vue({el:'#root',data:{n:1,},//--------------定义一个全新的配置项-------------directives:{fbind:{//以下函数都是固定的且常用的://指令与元素成功绑定时调用bind(element,binding){//此时可以写:样式、value值、绑定事件input.value = binding.value},//指令所在元素被插入页面时inserted(element,binding){element.focus()},//指令所在的模板重新解析时update(element,binding){input.value = binding.valueelement.focus()}}}})
</script>

bind和update函数的逻辑往往是一致的,所以也就有了函数式指令,因此如果没有其他特殊要求(获取焦点、拿到父元素),可以用函数式。

3 自定义指令容易犯的错

  1. 指令命名多个词用-连接(kebab-case),而不是写成驼峰命名法(camelCase),且directives配置项需要加‘’,定义时不加v-,但是使用时需要加。
    例如定义一个input元素的指令
    <input type="text" v-bigNumber:value="n">
    应写成
    <input type="text" v-big-number:value="n">
    对应Vue实例中配置项的函数式:
    'big-number'(){}
    实际上big-number为directives对象里的key,当出现-时不可简写
  2. 指令相关的回调函数的this不是vm而是Window
    console.log('fbind',this)
    输出为window
  3. 自定义指令为局部指令,只给有定义的vue实例使用
    即使用的模板的<div>中的id 和Vue实例中的el相对应
<script type="text/javascript">//对象式new Vue({directives:{指令名:{配置对象}}})//函数式new Vue({directives:{指令名(参数1,...){回调函数}}})
</script>

4 全局指令写法(参考过滤器写法):

  • 对象式:
<script type="text/javascript">
Vue.directive('fbind',{bind(element,binding){input.value = binding.value},inserted(element,binding){element.focus()},update(element,binding){input.value = binding.valueelement.focus()}
})
</script>
  • 函数式
<script type="text/javascript">
Vue.directive('fbind',function(element,binding){element.value = binding.valueelement.focus()
})
</script>

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

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

相关文章

跟《经济学人》学英文:2024年07月06日这期 Central banks are winning the battle against inflation

Central banks are winning the battle against inflation. But the war is just getting started Politics and protectionism will make life difficult 原文&#xff1a; The trajectory of inflation has not given central bankers much cause for celebration in rece…

android2024 gradle8 Processor和ksp两种编译时注解实现

android编译时注解&#xff0c;老生常谈&#xff0c;外面的例子都是bindView&#xff0c;脑壳看疼了&#xff0c;自己学习和编写下。 而且现在已经进化到kotlin2.0&#xff0c;google也逐渐放弃kapt&#xff0c;进入维护状态。所以要好好看看本贴。 参考我的工程&#xff1a; h…

gda动态调试-cnblog

忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法&#xff0c;选择调试方法&#xff0c;gda会自动监听函数的返回值&#xff0c;例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本

zigbee笔记:六、看门狗定时器(Watch Dog)

一、看门狗基础 1、看门狗功能&#xff1a; 由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成各种寄存器和内存的数据混乱&#xff0c;会导致程序指针错误等&#xff0c;程序运行可能会陷入死循环。程序的正常运行被打断&#xff0c;由单片机控制的系统无法继…

kafka系列之消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用KafkaListener(其实底层也是poll()方法)时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前所述&#xff0c;Kafka的一…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)

下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于学习&#xff01;&#xff01;&#xff01; 文章目录 前言 一、git 二、git常用命令 总结 前言 下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于…

解决前后端同一个端口跨域问题

前端起了一个代理 如果url是api开头的自动代理访问8080端口&#xff08;解决前后端端口不一致要么是前端代理&#xff0c;要么是后端加过滤器&#xff09; proxy:{/api:{target:http://localhost:8080,changeOrigin : true,// 替换去掉路径上的api// rewrite:(path)>path.r…

配置基于不同端口的虚拟主机

更改配置文件&#xff0c;添加三个不同端口的虚拟主机 <directory /www> allowoverride none require all granted </directory><virtualhost 192.168.209.136:80> documentroot /www servername 192.168.209.136 </virtualhost><virtualhost 192.…

【python基础】—如何理解安装程序时要配置Widows和DOS操作系统中的path环境变量?

文章目录 前言一、环境变量是什么&#xff1f;二、为什么需要设置环境变量&#xff1f;三、配置anaconda的环境变量 前言 在安装一些程序的时候&#xff0c; 我们总是需要将安装路径配置到正在使用电脑的环境变量里。为什么要进行这一步呢&#xff1f;本文主要解释Widows和DOS…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化2(优化排序、mongos优化)

优化排序 在MongoDB里面&#xff0c;如果能够利用索引来排序的话&#xff0c;直接按照索引顺序加载数据就可以了。如果不能利用索引来排序的话&#xff0c;就必须在加载了数据之后&#xff0c;再次进行排序&#xff0c;也就是进行内存排序。 可想而知&#xff0c;如果内存排序…

可视化大屏的强势在于预警和感知的科学依据可靠性强

**可视化大屏的强势&#xff1a;预警与感知的科学依据可靠性探究** 数据可视化已成为信息传递的重要手段。其中&#xff0c;可视化大屏作为一种直观、高效的展示方式&#xff0c;广泛应用于各个领域&#xff0c;如智慧城市、智慧交通、智慧医疗等。可视化大屏的强势不仅体现在…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

单机多网卡互通——问题跟踪+工具分析

一、背景 想搭建soft ROCE(RXE)与实体ROCE设备互联的测试环境&#xff0c;为了节省机器以及使用方便&#xff0c;预想在配备ROCE卡的主机上&#xff0c;用另一个网卡绑定soft ROCE&#xff0c;然后互通。 [ETH1 ROCE] <--------------------> [ETH2 RXE] 二、问题跟…

实验三 图像增强—灰度变换

一、实验目的&#xff1a; 1、了解图像增强的目的及意义&#xff0c;加深对图像增强的感性认识&#xff0c;巩固所学理论知识。 2、学会对图像直方图的分析。 3、掌握直接灰度变换的图像增强方法。 二、实验原理及知识点 术语‘空间域’指的是图像平面本身&#xff0c;在空…

昇思25天学习打卡营第17天|ChatGLM-6B聊天demo

一、简介&#xff1a; 本次实验&#xff0c;基于MindNLP和ChatGLM6B模型搭建一个小的聊天应用&#xff0c;ChatGLM6B 是基于 GLM-4 模型开发的开源对话机器人&#xff0c;拥有 62 亿个参数&#xff0c;能够进行自然流畅的语言交流。在对话中&#xff0c;ChatGLM6B 可以胜任文案…

js函数扩展内容---多参数,函数属性,字符串生成函数

1.多参数 在js中&#xff0c;Math.max()方法可以接受任意数量的参数&#xff0c; Math.max(1,2,3,4);//4 Math.max(1,2,3,4,5,6,7,8,9,10)//10 在max方法里面有一个rest参数&#xff0c;它接受了所有参数全部合成到了一个number数组里面&#xff0c; function rest(a,b,...a…

管理才是最根本的核心竞争力

相信大家对于华为提出的“管理是核心竞争力”“管理才是企业的核心竞争力”等言论并不陌生&#xff0c;而华为的确也一直践行这样的理念。比如&#xff0c;在华为发展历史上很艰难的2002年&#xff0c;华为仍然坚持重点抓管理。总裁任正非后来提到&#xff1a;“2002年华为快崩…

matplotlib下载安装

matplotlib下载安装过程同之前写的pygame很类似。 Pygame下载安装 python官网 1.搜索matplotlib 直接点进去 查看历史版本&#xff0c;因为新版本可能出现与python不匹配问题。 我选择3.6.3版本&#xff0c;因为我安装的python是3.8&#xff0c;可以匹配版本。同时window操…

价值499的从Emlog主题模板PandaPRO移植到wordpress的主题

Panda PRO 主题&#xff0c;一款精致wordpress博客主题&#xff0c;令人惊叹的昼夜双版设计&#xff0c;精心打磨的一处处细节&#xff0c;一切从心出发&#xff0c;从零开始&#xff0c;只为让您的站点拥有速度与优雅兼具的极致体验。 从Emlog主题模板PandaPRO移植到wordpres…

信创-系统架构师认证

随着国家对信息技术自主创新的战略重视程度不断提升&#xff0c;信创产业迎来前所未有的发展机遇。未来几年内&#xff0c;信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…