文档
作用
-
当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
-
作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为
钩子函数
bind
- 作用:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
inserted
- 作用:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
update
- 作用:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)
componentUpdated
- 作用:指令所在组件的 VNode 及其子 VNode 全部更新后调用
unbind
- 作用:只调用一次,指令与元素解绑时调用
钩子函数参数
注意点:除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行
el
- 作用:指令所绑定的元素,可以用来直接操作 DOM
binding
- 作用:一个对象,包含以下 property:
- name:指令名,不包括 v- 前缀
- value:指令的绑定值
- oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用
- expression:字符串形式的指令表达式
- arg:传给指令的参数,可选。
- modifiers:一个包含修饰符的对象
vnode
- 作用:Vue 编译生成的虚拟节点
oldVnode
- 作用:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用
操作
动态传参
:::details 点击查看代码
<div v-focus:[name]="{like:"篮球"}" class="loadtest" />
directives: {
focus(el, binding, vnode, oldVnode) {
const { arg } = binding
console.log(arg) // 输出 张文强
}
},
data() {
return {
name: '张文强'
}
}
:::
修改 data 数据
:::details 点击查看代码
<div v-focus="(value)=>{name=value}" />
directives: {
focus(el, binding, vnode, oldVnode) {
const { value } = binding
value('修改张文强')
}
},
data() {
return {
name: '张文强'
}
}
:::