详解Vue中的自定义指令


Posted in Vue.js onDecember 07, 2020

除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。在Vue里,代码复用的主要形式和抽象是组件。然而,有的情况下,仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。本文将详细介绍Vue自定义指令

指令注册

以一个input元素自动获得焦点为例,当页面加载时,使用autofocus可以让元素将获得焦点 。但是autofocus在移动版Safari上不工作。现在注册一个使元素自动获取焦点的指令

指令注册类似于组件注册,包括全局指令和局部指令两种

【全局指令】

使用Vue.diretive()来全局注册指令

// 注册一个全局自定义指令 v-focusVue.directive('focus', { // 当绑定元素插入到 DOM 中。
 inserted: function (el) {  // 聚焦元素  el.focus()
 }
})

【局部指令】

也可以注册局部指令,组件或Vue构造函数中接受一个 directives 的选项

var vm = new Vue({
 el: '#example',
 directives:{
  focus:{
   inserted: function (el) {
    el.focus()
   }   
  }
 }
})

然后可以在模板中任何元素上使用新的 v-focus 属性

<p id="example">
 <input v-focus></p>
<script>// 注册一个全局自定义指令 v-focusVue.directive('focus', { // 当绑定元素插入到 DOM 中。 inserted: function (el) {  // 聚焦元素  el.focus()
 }
})var vm = new Vue({
 el: '#example',
})</script>

详解Vue中的自定义指令

钩子函数

指令定义函数提供了几个钩子函数(可选)

【bind】

只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作

【inserted】

被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)

【update】

所在组件的 VNode 更新时调用,但是可能发生在其孩子的 VNode 更新之前。指令的值可能发生了改变也可能没有。但是可以通过比较更新前后的值来忽略不必要的模板更新

【componentUpdated】

所在组件的 VNode 及其孩子的 VNode 全部更新时调用

【unbind】

只调用一次, 指令与元素解绑时调用

钩子函数参数

钩子函数被赋予了以下参数

【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 钩子中可用

[注意]除了 el 之外,其它参数都是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行

下面是一个使用了这些参数的自定义钩子样例

<p id="example" v-demo:foo.a.b="message"></p>
<script>Vue.directive('demo', {
 bind: function (el, binding, vnode) {  var s = JSON.stringify
  el.innerHTML =
   'name: '    + s(binding.name) + '<br>' +
   'value: '   + s(binding.value) + '<br>' +
   'expression: ' + s(binding.expression) + '<br>' +
   'argument: '  + s(binding.arg) + '<br>' +
   'modifiers: ' + s(binding.modifiers) + '<br>' +
   'vnode keys: ' + Object.keys(vnode).join(', ')
 }
})new Vue({
 el: '#example',
 data: {
  message: 'hello!'
 }
})</script>

详解Vue中的自定义指令

【函数简写】

大多数情况下,可能想在bind和update钩子上做重复动作,并且不想关心其它的钩子函数。可以这样写:

Vue.directive('color-swatch', function (el, binding) {
 el.style.backgroundColor = binding.value
})

【对象字面量】

如果指令需要多个值,可以传入一个JS对象字面量。指令函数能够接受所有合法类型的JS表达式

<p v-demo="{ color: 'white', text: 'hello!' }"></p>
Vue.directive('demo', function (el, binding) {
 console.log(binding.value.color) // => "white"
 console.log(binding.value.text) // => "hello!"
})

以上就是详解Vue中的自定义指令的详细内容,更多关于vue 自定义指令的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
vue el-upload上传文件的示例代码
Dec 21 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue中使用mockjs配置和使用方式
Apr 06 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
vue动态绑定style样式
Apr 20 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
vue-router定义元信息meta操作
Dec 07 #Vue.js
Vue如何实现验证码输入交互
Dec 07 #Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 #Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 #Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 #Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 #Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 #Vue.js
You might like
浅析php适配器模式(Adapter)
2014/11/25 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP实现的简单缓存类
2015/07/29 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python实现代码统计工具(终极篇)
2016/07/04 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python numpy库np.percentile用法说明
2020/06/08 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
任课老师推荐信范文
2013/11/24 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
雨花台导游词
2015/02/06 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
Python函数中的不定长参数相关知识总结
2021/06/24 Python
vue自定义右键菜单之全局实现
2022/04/09 Vue.js