详解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 相关文章推荐
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
Vue实现todo应用的示例
Feb 20 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue实现移动端div拖动效果
Mar 03 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
vue组件vue-esign实现电子签名
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
PHP 中的类
2006/10/09 PHP
php木马webshell扫描器代码
2012/01/25 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
简单了解OpenCV是个什么东西
2017/11/10 Python
Python处理文本换行符实例代码
2018/02/03 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
怎样写好自我鉴定
2013/12/04 职场文书
德育标兵事迹材料
2014/08/24 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2014年财务科工作总结
2014/11/11 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
北大自主招生自荐信
2015/03/04 职场文书
如何写通讯稿
2015/07/22 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python