详解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 elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
vue在图片上传的时候压缩图片
Nov 18 Vue.js
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
Vue详细的入门笔记
May 10 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
解决vue中provide inject的响应式监听
Apr 19 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
vue 自定义组件添加原生事件
Apr 21 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
建立动态的WML站点(一)
2006/10/09 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
python搜索指定目录的方法
2015/04/29 Python
python比较两个列表大小的方法
2015/07/11 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
python爬取个性签名的方法
2018/06/17 Python
对python的输出和输出格式详解
2018/12/08 Python
详解Python用户登录接口的方法
2019/04/17 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
中秋节主持词
2014/04/02 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
工程款申请报告
2015/05/15 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫