1 概述
除了内置指令外,Vue 也允许注册自定义指令
有的情况下,你仍然需要对普通 DOM 元素进行底层操作
这时候使用自定义指令更为方便
文档
https://cn.vuejs.org/v2/guide/custom-directive.html
2 要点
2.1 注册全局指令
// 指令名不要带 v-
Vue.directive('指令名', {
// el 代表使用了此指令的那个 DOM 元素
// binding 可获取使用了此指令的绑定值 等
inserted: function (el, binding) {
// 逻辑代码
}
})
2.2 注册局部指令
directives : {
'指令名' : {
// 指令名不要带 v-
inserted (el, binding) {
// 逻辑代码
}
}
}
2.3 使用方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义指令</title>
</head>
<body>
<div id="app">
<p v-upper-text="message"></p>
自动获取焦点:
<input type="text" v-focus>
</div>
<script src="../js/vue.js" type="text/javascript"></script>
<script type="text/javascript">
// 1. 注册一个全局 v-upper-text 指令,注意指令名不要带 v-
Vue.directive('upper-text', {
// 因为是样式,所以不需要元素插入到DOM中,就好像link引入CSS文件时并不关心元素是否加载
bind: function (el) {
el.style.color = 'red'
},
// el 代表使用了此指令的那个 DOM 元素
// binding 可获取使用了引指令的绑定值 等
inserted: function (el, binding) {
// 将在 v-upper-text 指令中获取到的值,变成大写输出到标签体中
el.innerHTML = binding.value.toUpperCase()
}
})
new Vue({
el: '#app', data: {
message: 'mengxuegu,陪你学习伴你梦想'
},
//2. 注册一个局部指令 v-focus
directives: {
'focus': {
//和js行为有关的操作,最好在inserted中执行,和样式相关的操作都可在bind中执行
inserted: function (el) {
// 聚焦元素 el.focus()
}
}
}
})
</script>
</body>
</html>
2.4 钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
bind
:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
update
:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
componentUpdated
:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind
:只调用一次,指令与元素解绑时调用。
网友评论