Vue2入门之超详细教程十八-自定义指令

news/2024/10/2 14:32:29

Vue2入门之超详细教程十四-自定义指令

1、简介

  • 定义语法
    • 分为局部自定义指令和全局自定义指令
  • 配置对象中常用的3个回调
    • bind:指令与蒜素被插入成功时调用
    • inserted:指令所在元素被插入页面时被调用
    • update:指令所在模板结构被重新解析时调用
  • 备注:
    • 指令定义时不加v-,但使用时要加v-
    • 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

学习Vue之前最后会一些HTML和CSS的基础知识,HTML基础知识 传送门,CSS基础知识 传送门。

2、自定义指令

1. 局部自定义指令

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍

需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点

需求1实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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(){return {n:1,}}})
</script>
</html>

image-20240107155344516

该错误是因为我们用了一个不存在的指令v-big,v-big是原生Vue中不存在的质量,我们需要给它定义一个

directives:{big(element,binding){console.log(element,binding)}
}

image-20240107161620308

自定义指令接收两个参数,第一个是真实dom第二个是虚拟dom

directives:{big(element,binding){element.innerText = binding.value * 10}
}

image-20240107161821194

需求2实现

<input type="text" v-fbind:value="n">
directives:{fbind(element,binding){element.value = binding.valueelement.focus()}
}

image-20240107163141324

这样写有一个问题,即当页面刚渲染时,input输入框并不会获取焦点,只有当点击按钮后才会获取焦点

这是因为我们调用element.focus()时,input输入框还没有形成

fbind:{//指令与元素成功绑定时(一上来)bind(element,binding){element.value = binding.value},// 指令所在元素被插入页面时inserted(element,binding){ element.focus()},// 指令所在模板被重新解析时update(element,binding){element.value = binding.valueelement.focus()}
}

2. 全局自定义指令


Vue.directive('fbind',{//指令与元素成功绑定时(一上来)bind(element,binding){element.value = binding.value},// 指令所在元素被插入页面时inserted(element,binding){ element.focus()},// 指令所在模板被重新解析时update(element,binding){element.value = binding.valueelement.focus()}
})
Vue.directive('big',{big(element,binding){element.innerText = binding.value * 10console.log(element,binding)}
})

3、完整代码

1. 局部自定义指令完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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><br><input type="text" v-fbind:value="n"></div>
</body>
<script type="text/javascript">new Vue({el:'#root',data(){return {n:1,}},directives:{big(element,binding){element.innerText = binding.value * 10console.log(element,binding)},fbind:{//指令与元素成功绑定时(一上来)bind(element,binding){element.value = binding.value},// 指令所在元素被插入页面时inserted(element,binding){ element.focus()},// 指令所在模板被重新解析时update(element,binding){element.value = binding.valueelement.focus()}}}})
</script>
</html>

2. 全局自定义指令完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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><br><input type="text" v-fbind:value="n"></div>
</body>
<script type="text/javascript">Vue.directive('fbind',{//指令与元素成功绑定时(一上来)bind(element,binding){element.value = binding.value},// 指令所在元素被插入页面时inserted(element,binding){ element.focus()},// 指令所在模板被重新解析时update(element,binding){element.value = binding.valueelement.focus()}})Vue.directive('big',{big(element,binding){element.innerText = binding.value * 10console.log(element,binding)}})new Vue({el:'#root',data(){return {n:1,}}})
</script>
</html>

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

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

相关文章

龙哥量化:通达信牛股低位起涨指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889 VAR1:=3*SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1),3,1);VAR2:=EMA(VAR1,8);VAR3:=3*SMA((C-LLV(L,55))/(H…

龙哥量化:通达信回踩买入指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889A1:=COUNT(C<O,5)<=3;A2:=C/REF(C,5)<0.85;A3:=(MA(CLOSE,5)-C)/MA(CLOSE,5)<0.2;A4:=MA(C,20)>REF(MA(C,20),1);A5:=(REF(C,1)-C)/REF(C,1)>0.09;回踩买入:=A1 AND A2 AND A3 AND A…

企业跨境文件传输的核心痛点,怎样保证稳定可靠的传输性能?

随着经济和国际贸易的发展,企业跨境文件传输日趋频繁,多个行业均存在高频且大量的跨境文件传输需求:跨境电子商务: 跨境电商平台需要进行跨国的订单、支付和物流信息的传输,以便顺利完成交易和配送。涉及跨国企业的内部沟通、订单管理、跨境电商的订单处理等。 金融服务:…

用于将字节进行base64编码或解码(C语言实现)

用于将数据进行base64编码或解码,模块化封装, 已测试.V1.0 2024年6月13日 发布于博客园目录base64.hbase64.c 基本原理见代码注释! base64.h #ifndef _BASE64_H #define _BASE64_H /*** @file name : base64.h* @brief : 用于将字节进行base64编码或解码* @author : RIS…

初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析

1. 初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析 @目录1. 初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析每博一文案2. 前沿知识2.1 框架(framework)2.2 三层架构2.3 分析 JDBC 的缺点3. 初始了解MyBatis4. MyBat…

VSCode弹窗无法应用,终端无法键入命令行解决方法

1、VSCode弹窗无法应用 解决方式:卸载通义灵码插件 2.终端无法键入命令行 解决方式:取消兼容模式,添加设置

git提交代码步骤以及工作中常用的git命令

确保在开始这些步骤之前,你已经配置了 Git 用户信息(git config --global user.name "Your Name" 和 git config --global user.email "your.email@example.com"),并且已经克隆了远程仓库(git clone <repository-url>)。https://www.cnblogs.c…

快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用

本文介绍了如何使用ModelBox开发一个动物目标检测的AI应用,从而掌握图片标注、数据处理和模型训练方法,以及对应的推理应用逻辑。本文分享自华为云社区《ModelBox-AI应用开发:动物目标检测【玩转华为云】》,作者:阳光大猫。 一、准备环境 ModelBox端云协同AI开发套件(Win…