Vue 源码解析 指令
用法
全局: Vue.directive —-> 存放在
Vue.options['directives']
中
局部: 组件内的 directive 选项中定义 —-> 存放在vm.$options['directives']
中
1 | <input v-focus></input>; |
监听时机
钩子触发时机
init
- 触发时机: 已创建 VNode,在 patch 期间发现新的虚拟节点时被触发
- 回调参数: VNode
create
- 触发时机: 已基于 VNode 创建了 DOM 元素
- 回调参数: emptyNode 和 VNode
activate
- 触发时机: keep-alive 组件被创建
- 回调参数: emptyNode 和 VNode
insert
- 触发时机: VNode 对应的 DOM 元素被插入到父节点中时被触发
- 回调参数: VNode
prepatch
- 触发时机: 一个 VNode 即将被 patch 前触发
- 回调参数: oldVNode 和 VNode
update
- 触发时机: 一个 VNode 更新时触发
- 回调参数: oldVNode 和 VNode
postpatch
- 触发时机: 一个 VNode 被 patch 完毕时触发
- 回调参数: oldVNode 和 VNode
destory
- 触发时机: 一个 VNode 对应的 DOM 元素从 DOM 中移除时或者它的父元素从 DOM 中移除时触发
- 回调参数: VNode
remove
- 触发时机: 一个 VNode 对应的 DOM 元素从 DOM 中移除时触发。与 destory 不同的是,如果是直接将该 VNode 的父元素从 DOM 中移除导致该元素被移除,那么不会触发
- 回调参数: VNode 和 removeCallback
在 create、update、destory 三个阶段监听自定义指令
指令钩子函数
Vue 对于自定义指令定义对象提供了几个钩子函数,这几个钩子函数分别对应着指令的几种状态,一个指令从第一次被绑定到元素上到最终与被绑定的元素解绑,它会经过以下几种状态
- bind: 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
- inserted: 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
- update: 所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前
- componentUpdated: 指令所在组件的 VNode 及其子 VNode 全部更新后调用
- unbind: 只调用一次,指令与元素解绑时调用
updateDirectives: 在合适的时机执行定义指令时所设置的钩子函数
1 | function updateDirectives(oldVnode, vnode) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Nanyin の 小屋!
评论