作用:
在需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。Vue除了提供了默认内置的指令外,还允许开发人员根据实际情况自定义指令。可以注册全局自定义指令,也可以注册局部指令。
参数:
第一个参数为自定义指令名称(指令名称不需要加 v- 前缀,默认是自动加上前缀的,使用指令的时候一定要加上前缀),第二个参数可以是对象数据,也可以是一个指令函数。
<div class="demo">
<!-- 全局注册 -->
<input type="text" placeholder="我是全局自定义指令" v-focus>
</div>
<script>
// 注册一个全局自定义指令 `v-focus`
('focus', {
// 当被绑定的元素插入到 DOM 中时……
inserted: function (el) {
// 聚焦元素
()
}
})
//注册局部指令
directives: {
focus: {
// 指令的定义
inserted: function (el) {
()
}
}
}
</script>
自定义指令的钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
- inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
- update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 。
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
- unbind:只调用一次,指令与元素解绑时调用。
这段是从官方文档copy来的,相信应该都一看就明白的。
那么这几个钩子函数怎么使用呢?先来看看钩子函数的几个参数吧。指令钩子函数会被传入以下参数:
- el: 指令所绑定的元素,可以用来直接操作 DOM,就是放置指令的那个元素。
- binding: 一个对象,里面包含了几个属性,这里不多展开说明,官方文档上都有很详细的描述。
- vnode:Vue 编译生成的虚拟节点。
- oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。