Vue自定义指令介绍(2)


Posted in Javascript onDecember 08, 2016

Vue指令

Vue的指令以v-开头,作用在HTML元素上,将指令绑定在元素上,给绑定的元素添加一些特殊行为。

例如:

<h1 v-if="yes">Yes</h1>

其中,v-是Vue的标识,if是指令ID,yes是expression。yes是MVVM中的VM即ViewModel,当它的值发生变化,就会触发指令,改变View视图的显示。

expression还可以使用内联的模式,任何依赖的属性发生变化时都会触发指令的执行。如:

<h1 v-if="'yes '+ user.name + ', ' + time"></h1>

可以使用逗号分割多重指令,如:

<div v-on="click:onClick, keyup:onKeyup, keydown:onKeydown"></div>

Vue自定义指令

自定义指令语法

Vue自定义指令语法如下:

Vue.directive(id, definition)

传入的两个参数,id是指指令ID,definition是指定义对象。其中,定义对象可以提供一些钩子函数。

钩子函数

定义对象的钩子函数如下:

Vue自定义指令介绍(2)

钩子函数参数

定义对象的钩子函数参数如下:

el: 指令所绑定的元素,可以用来直接操作 DOM 。
binding: 一个对象,包含以下属性:
     name: 指令名,不包括 v- 前缀。
     value: 指令的绑定值, 例如: 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 钩子中可用。

使用例子

Vue自定义指令常见使用例子如下:

Vue.directive('my-directive', {
 bind: function(){
 //做绑定的准备工作
 //比如添加事件监听器,或是其他只需要执行一次的复杂操作
 },
 inserted: function(){
 //...
 },
 update: function(){
 //根据获得的新值执行对应的更新
 //对于初始值也会调用一次
 },
 componentUpdated: function(){
 //...
 },
 unbind: function(){
 //做清理操作
 //比如移除bind时绑定的事件监听器
 }
})

当指令的定义对象中只使用update时,只需直接传入函数即可,如下:

Vue.directive('my-directive', function(){
 //...
})

一个简单示例

下面将讲解一个简单的例子,当页面加载时,input输入框将自动聚焦。
代码如下:

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="utf-8">
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 </head>
 <body>
 <div id="app">
  <input v-focus>
 </div>
 <script>
  //注册一个全局自定义指令v-focus
  Vue.directive('focus', {
  // 当绑定元素插入到DOM中
  inserted: function (el) {
  // 聚焦元素
  el.focus()
  }
  });
  var app = new Vue({
  el: '#app'
  });
 </script>
 </body>
</html>

运行截图:

Vue自定义指令介绍(2)

使用钩子函数参数的例子

下面将讲解一个使用钩子函数参数的例子,将元素的字体色设置为#fff,将背景色设置为传入指令的参数red,并将指令名,指令绑定值,指令绑定值的表达式,传入指令的参数显示在<div>中。
代码如下:

<!DOCTYPE html>
<html>
 <head lang="en">
 <meta charset="utf-8">
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 </head>
 <body>
 <div id="hook-arguments-example" v-demo-directive:red="message"></div>
 <script>
 Vue.directive('demoDirective', {
  bind: function(el, binding, vnode){
  el.style.color = '#fff'
  el.style.backgroundColor = binding.arg
  el.innerHTML = 
   '指令名name - ' + binding.name + '<br>' +
   '指令绑定值value - ' + binding.value + '<br>' +
   '指令绑定表达式expression - ' + binding.expression + '<br>' +
   '传入指令的参数argument - ' + binding.arg + '<br>'
  },
 });
 var demo = new Vue({
  el: '#hook-arguments-example',
  data: {
  message: 'hello!'
  }
 })
 </script>
 </body>
</html>

运行截图:

Vue自定义指令介绍(2)

对象字面量

同一个特性内部,逗号分隔的多个从句被绑定为多个指令实例。如,下例中指令被创建和调用了两次:

<div v-demo="color: 'white', text: 'hello'"></div>

如果指令需要多个值,可以传入一个JavaScript对象字面量。如:

<!DOCTYPE html>
<html>
 <head lang="en">
 <meta charset="UTF-8">
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 </head>
 <body>
 <div id="hook-arguments-example" v-demo-directive="{ color: 'white', text: 'hello!' }"></div>
 <script>
 Vue.directive('demoDirective', function(el, binding, vnode){
  console.log(binding.value.color);
  console.log(binding.value.text);
 });
 var demo = new Vue({
  el: '#hook-arguments-example'
 })
 </script>
 </body>
</html>

运行截图:

Vue自定义指令介绍(2)

字面指令

若在创建自定义指令时,设置isLiterral: true,则特性值被视作字符串,并赋给该指令的expression,字面指令不会建立数据监视。

参考链接

Vue.js教程 (2) : 指令 Directives
Vue.JS入门篇?自定义指令
vue.js笔记——指令

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

Javascript 相关文章推荐
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
Dec 19 Javascript
js 本地预览的简单实现方法
Feb 18 Javascript
用jquery的方法制作一个简单的导航栏
Jun 23 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
Vue异步组件使用详解
Apr 08 Javascript
微信小程序中页面FOR循环和嵌套循环
Jun 21 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
重新认识vue之事件阻止冒泡的实现
Aug 02 Javascript
vue 解决provide和inject响应的问题
Nov 12 Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 #Javascript
解析利用javascript如何判断一个数为素数
Dec 08 #Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 #Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 #Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 #Javascript
浅谈JavaScript的闭包函数
Dec 08 #Javascript
node.js Sequelize实现单实例字段或批量自增、自减
Dec 08 #Javascript
You might like
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP整合PayPal支付
2015/06/11 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
php中yii框架实例用法
2020/12/22 PHP
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
jquery选择器使用详解
2014/04/08 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
Python遍历numpy数组的实例
2018/04/04 Python
python3 读写文件换行符的方法
2018/04/09 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
用 Python 制作地球仪的方法
2020/04/24 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
《第一朵杏花》教学反思
2014/04/16 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
浅析NIO系列之TCP
2021/06/15 Java/Android
Golang 入门 之url 包
2022/05/04 Golang