# 文档初探(十二): 自定义指令
Vue 提供了v-on
, v-bind
等指令给我们使用, 同时也提供了自定义指令的功能.
下面实现一个页面加载后自动对输入框 focus 的功能
// 全局注册
Vue.directive("focus", {
inserted(el) {
el.focus();
}
});
new Vue({
el: "#app",
template: `
<input v-focus/> //绑定元素
`
});
// 局部注册
directives: {
inserted(el){
el.focus();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 钩子函数
指令里有几个钩子函数可以调用:
bind
: 只调用一次, 当指令第一次绑定元素时才会调用.在这里可以做一些一次性的操作.inserted
: 在绑定元素插入到父节点的时候调用.update
: 在包含指令的组件的 VNode 更新时,但又在包含指令的组件的子组件更新之前调用. 这个指令的值可能会也可能不会改变, 所以你可以跳过不必要的更新, 通过对比绑定的当前值与之前的值是否有差异(下面会介绍到).componentUpdated
: 在包含指令的组件的 VNode以及其子组件都更新后调用.unbind
: 只调用一次, 当指令解绑时调用.
# 钩子函数的参数
el
: 指绑定指令的元素, 可以用它直接操作 DOM.binding
: 包含以下属性的对象:name
: 指令的名字, 没有v-
前缀.value
: 传递给指令的值.比如v-x="1+1"
, 那么value
的值是2
.oldValue
: 之前的value
, 只能在update
和componentUpdate
两个钩子里使用.无论value
是否改变都可以使用.expression
: 上面举例value
里的1+1
就是一个表达式.arg
: 传递给指令的参数. 如v-y:foo
,arg
就是foo
.modifiers
: 包含修饰符的对象, 如果存在.比如v-z:foo.bar
, 那么修饰符对象就是{foo: true, bar: true}
vnode
: 由 Vue 的编译器生成的虚拟节点.oldVnode
: 之前的vnode
, 只能在update
和componentUpdate
两个钩子里使用.
WARNING
除了el
之外, 其他参数都应当作为只读且不可修改的.
# 动态指令参数
指令参数可以是动态的, 可以写成这种形式:v-n:[arguments]=value
. argument
可以根据data
的属性动态地传入进组件实例.