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 相关文章推荐
Ext JS添加子组件的误区探讨
Jun 28 Javascript
Angularjs的ng-repeat中去除重复数据的方法
Aug 05 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
Sep 01 Javascript
微信和qq时间格式模板实例详解
Oct 21 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
Nov 09 Javascript
使用Bootstrap美化按钮实例代码(demo)
Feb 03 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
May 10 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
Jun 18 jQuery
node中实现删除目录的几种方法
Jun 24 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
Oct 28 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
php实现文件预览功能
2017/05/23 PHP
javascript数组去掉重复
2011/05/12 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
Python的词法分析与语法分析
2013/05/18 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
python实现桌面托盘气泡提示
2019/07/29 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
人力资源专业推荐信
2013/11/29 职场文书
安全事故检讨书
2014/01/18 职场文书
小学捐书活动总结
2014/07/05 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
国家助学金感谢信
2015/01/21 职场文书
会计简历自我评价
2015/03/10 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
入党介绍人意见范文
2015/06/01 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
MySQL索引失效场景及解决方案
2022/07/23 MySQL