Vue.js自定义指令学习使用详解


Posted in Javascript onOctober 19, 2019

自定义指令

自定义指令的注册方法和组件很像,也分全局注册和局部注册,比如注册一个v-focus指令用于在<input>、<textarea>元素初始化时自动获得焦点,共有两种写法:

//全局注册
Vue.directive('focus',{
 //指令选项
});


//局部注册
var app = new Vue({
 el: '#app',
 directive: {
 focus: {
 //指令选项
 }
 }
});

自定义指令的选项是由几个钩子函数组成的,每个都是可选的。

自定义指令的各个选项如下:

  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必在于document中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次,指令与元素解绑时调用。

可以根据需求在不同的钩子函数内完成逻辑代码,例如上面的v-focus,我们希望在元素插入父节点时就调用,那用到的最好是inserted。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 <title>自定义指令</title>
</head>
<body>
 <div id="app">
 <input type="text" v-focus>
 </div>
 <script>
 Vue.directive('focus',{
  inserted: function (el) {
  //聚焦元素
  el.focus();
  }
 });

 var app = new Vue({
  el: '#app'
 });
 </script>
</body>
</html>

Vue.js自定义指令学习使用详解

每个钩子函数都有几个参数可用,具体如下:

  • el: 指令所绑定的元素,可以用来直接操作DOM
  • binding: 一个对象,包含以下属性:

    name:指令名,不包括v-前缀
    valule:指令的绑定值,例如v-my-directive=“1 + 1”,value的值是2
    oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用。无论值是否改变都可用
    expression:绑定值的字符串形式。例如v-my-directive=“1 + 1”,expression的值是”1 + 1“
    arg:传给指令的参数。例如v-my-directive:foo,arg的值是foo
    modifiers:一个包含修饰符的对象。例如v-my-directive.foo.bar,修饰符对象modifiers的值是{ foo:true, bar:true}

  • vnode: Vue编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点仅在update和componentUpdated钩子中可用。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 <title>自定义指令</title>
</head>
<body>
 <div id="app">
 <div v-test:msg.a.b="message"></div>
 </div>
 <script>
 Vue.directive('test',{
  bind: function (el, binding, vnode) {
  var keys = [];
  for(var i in vnode){
   keys.push(i);
  }
  el.innerHTML = 
   'name:' + binding.name + '<br/>' +
   'value:' + binding.value + '<br/>' +
   'expression:' + binding.expression + '<br/>' +
   'argument:' + binding.arg + '<br/>' + 
   'modifiers:' + JSON.stringify(binding.modifiers) + '<br/>' + 
   'vnode keys' + keys.join(',');
  }
 });

 var app = new Vue({
  el: '#app',
  data: {
  message: 'some text'
  }
 });
 </script>
</body>
</html>

Vue.js自定义指令学习使用详解

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 切换不同图片示例代码
Dec 05 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
jquery实现炫酷的叠加层自动切换特效
Feb 01 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
Oct 29 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
Nov 23 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
Dec 08 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
Aug 16 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
JS ES6异步解决方案
Apr 29 Javascript
Vue.js标签页组件使用方法详解
Oct 19 #Javascript
基于JavaScript获取base64图片大小
Oct 18 #Javascript
react MPA 多页配置详解
Oct 18 #Javascript
vue滚动插件better-scroll使用详解
Oct 18 #Javascript
VUE实现密码验证与提示功能
Oct 18 #Javascript
VUE实现图片验证码功能
Nov 18 #Javascript
countUp.js实现数字滚动效果
Oct 18 #Javascript
You might like
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
Python查找相似单词的方法
2015/03/05 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python修改DBF文件指定列
2020/12/19 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
工程力学专业自荐信范文
2014/03/17 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
毕业实习单位意见
2015/06/04 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers