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 相关文章推荐
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
基于jQuery的倒计时实现代码
May 30 Javascript
JS获取鼠标坐标的实例方法
Jul 18 Javascript
JS中实现简单Formatter函数示例代码
Aug 19 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
Vue实现动态显示textarea剩余字数
May 22 Javascript
详解如何优雅地在React项目中使用Redux
Dec 28 Javascript
Node.js爬取豆瓣数据实例分析
Mar 05 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
js实现三角形粒子运动
Sep 22 Javascript
JavaScript数组reduce()方法的语法与实例解析
Jul 07 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
PHP 裁剪图片
2021/03/09 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
指针和引用有什么区别
2013/01/13 面试题
公司租房协议书
2014/10/14 职场文书
政风行风整改报告
2014/11/06 职场文书
老公保证书怎么写
2015/02/26 职场文书
停发工资证明范本
2015/06/12 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Python中的套接字编程是什么?
2021/06/21 Python
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript