VUE框架的使用让我们前端开发从繁重的操作DOM工作中脱离出来,转向关注于数据的操作。但是有时候会想念操作DOM的日子,尤大大给我们提供了方法,他就是vue的自定义指令,一个可以操作底层DOM元素的通道。相信v-model,v-show这些vue自带的核心指令已经用烦了,今天写自己定义的指令。

  一.指令注册及使用

  自定义指令就和组件一样需要先注册再使用,那么也分为全局与局部。

  1.全局注册

1 // 注册一个全局自定义指令 v-focus
2 Vue.directive('focus', {
3   // 当绑定元素插入到 DOM 中。
4   inserted: function (el) {
5     // 聚焦元素
6     el.focus()
7   }
8 })

  2.组件内注册

 1 var vm = new Vue({
 2   el: '#app',
 3   directives:{
 4     focus:{
 5       inserted: function (el) {
 6         el.focus()
 7       }      
 8     }
 9   }
10 })

  3.具体使用

1 <div id="app">
2   <input v-focus>//v-focus就是我们前边注册指令
3 </div>

  二.指令中的钩子函数

   指令的钩子函数和vue的生命周期钩子函数相似,在合适的时间点干正确的事情。

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

   2.inserted:被绑定元素插入父元素时调用(父节点存在即可,不一定非要在document中)

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

   4.componentUpdated:所在组件的 VNode 及其孩子的 VNode 全部更新时调用。

   5.unbind只调用一次,指令与元素解绑时调用。

  三.钩子函数中的参数

   1.el:指令所绑定的元素,可以直接操作DOM元素。

   2.bind:这是一个对象,里边还有好多属性

     ①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 }。

  3.vnode:Vue编译生成的虚拟节点
  4.oldNode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
 1 Vue.directive("yingaxiang",{
 2             // 当该指令第一次绑定到元素上时调用,只调用一次,可以用来执行初始化操作(简言之,指令绑定到元素)
 3             bind:function(){//常用!!!
 4                 alert("当该指令第一次绑定到元素上时调用,只调用一次,可以用来执行初始化操作")
 5             },
 6             //被绑定有自定义指令的元素插入到DOM中时调用,在这里是插入到了#container中(简言之,元素插入到DOM元素中)
 7             inserted:function(){
 8                 alert("被绑定有自定义指令的元素插入到DOM(父节点)中时调用,在这里是插入到了#container中")
 9             },
10             // 当被绑定的元素所在模板更新时调用
11             update:function(){
12                 alert("当被绑定的元素所在模板更新时调用")
13             },
14             // 当被绑定的元素所在模板完成一次更新时调用(模板更新后调用)
15             componentUpdated:function(){
16                 alert("当被绑定的元素所在模板完成一次更新时调用(模板更新后调用)")
17             },
18             // 当指令和元素解绑的时候调用,只执行一次(因为毕竟解绑一次就完成了嘛!)
19             unbind:function(){
20                 alert("当指令和元素解绑的时候调用,只执行一次(因为毕竟解绑一次就完成了嘛!)")
21             }
22         })

在git上看到的一些好的并且实用指令,支持npm下载

  1.vue-lazyload图片懒加载
  安装: npm install --save vue-lazyload
  使用:<img v-lazy="./image.jpg">

  2.v-Tooltip顶部提示消息
  安装: npm install --save v-tooltip
  使用:<button v-tooltip="You hanve" + count + "new maeeage">

  3.v-clampy截断元素中的文本并在末尾加上省略号
  安装:npm install --save @clampy-js/vue-clampy
  使用:<p v-clampy="3">yingaxiang</p>

  4.v-mask格式化时间
  安装:npm install --save vue-inputmask
  使用:<input type="text" v-mask="66/66/66">

  5.v-ripple会给点击元素加一个波纹特效
  安装:npm install --save vue-ripple-directive
  使用:<div v-ripple>button</div>
posted on 2020-06-12 15:23  前端幼儿园_影啊翔  阅读(672)  评论(0编辑  收藏  举报