面试题答案
一键面试beforeUpdate钩子函数
- 实现原理:
- 在Vue的响应式系统中,当数据发生变化时,会触发依赖收集阶段所收集的Watcher的
update
方法。 - 在
update
方法中,会先执行beforeUpdate
钩子函数。这是因为Vue在更新DOM之前,会遍历当前组件实例的_watchers
数组(该数组存放了当前组件相关的Watcher)。 - 对于每个Watcher,在进行实际的DOM更新操作前,会检查该Watcher对应的组件实例是否存在
beforeUpdate
钩子函数,如果存在则执行。
- 在Vue的响应式系统中,当数据发生变化时,会触发依赖收集阶段所收集的Watcher的
- 在数据更新流程中的作用:
- 主要用于在数据更新,但DOM还未更新之前执行一些操作。例如,可以在此钩子函数中做一些数据的预处理,或者在更新DOM前记录一些状态信息等。比如,一个列表组件在数据更新前,记录当前列表的滚动位置,以便在DOM更新后可以恢复到相同位置。
- 底层实现差异(与updated对比):
beforeUpdate
执行在数据变化后,DOM更新前。它主要依赖于Watcher的update
方法触发,通过遍历_watchers
数组,找到组件实例的beforeUpdate
钩子并执行。
updated钩子函数
- 实现原理:
- 当Watcher执行完
update
方法中所有的DOM更新操作后,会触发updated
钩子函数。 - Vue在完成DOM更新后,会遍历当前组件实例的
_watchers
数组,检查组件实例是否存在updated
钩子函数,如果存在则执行。
- 当Watcher执行完
- 在数据更新流程中的作用:
- 用于在数据和DOM都更新完成后执行操作。比如可以在此时进行一些需要依赖最新DOM状态的操作,像重新初始化第三方插件(因为插件可能依赖最新的DOM结构),或者进行一些基于最新DOM状态的计算等。
- 底层实现差异(与beforeUpdate对比):
updated
执行在数据变化且DOM更新完成之后。它是在Watcher完成所有DOM更新相关操作后,通过遍历_watchers
数组触发执行,而beforeUpdate
是在DOM更新操作前执行。