vue2中如何自定义指令

24 阅读2分钟

作用:

在需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。Vue除了提供了默认内置的指令外,还允许开发人员根据实际情况自定义指令。可以注册全局自定义指令,也可以注册局部指令。

参数:

第一个参数为自定义指令名称(指令名称不需要加 v- 前缀,默认是自动加上前缀的,使用指令的时候一定要加上前缀),第二个参数可以是对象数据,也可以是一个指令函数。

 <div id="app" class="demo">
     <!-- 全局注册 -->
     <input type="text" placeholder="我是全局自定义指令" v-focus>
 </div>
 <script>
 // 注册一个全局自定义指令 `v-focus`
 Vue.directive('focus', {
   // 当被绑定的元素插入到 DOM 中时……
   inserted: function (el) {
     // 聚焦元素
     el.focus()
   }
 })
 ​
 ​
 //注册局部指令
 directives: {
   focus: {
     // 指令的定义
     inserted: function (el) {
       el.focus()
     }
   }
 }
 ​
 </script>

自定义指令的钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

这段是从官方文档copy来的,相信应该都一看就明白的。

那么这几个钩子函数怎么使用呢?先来看看钩子函数的几个参数吧。指令钩子函数会被传入以下参数:

  • el: 指令所绑定的元素,可以用来直接操作 DOM,就是放置指令的那个元素。
  • binding: 一个对象,里面包含了几个属性,这里不多展开说明,官方文档上都有很详细的描述。
  • vnode:Vue 编译生成的虚拟节点。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。