MST
星途 面试题库

面试题:Vue源码视角下beforeUpdate与updated的实现原理及差异

从Vue源码角度分析beforeUpdate与updated钩子函数的实现原理,详细说明它们在数据更新流程中的不同作用以及底层实现上的差异。
38.0万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

beforeUpdate钩子函数

  1. 实现原理
    • 在Vue的响应式系统中,当数据发生变化时,会触发依赖收集阶段所收集的Watcher的update方法。
    • update方法中,会先执行beforeUpdate钩子函数。这是因为Vue在更新DOM之前,会遍历当前组件实例的_watchers数组(该数组存放了当前组件相关的Watcher)。
    • 对于每个Watcher,在进行实际的DOM更新操作前,会检查该Watcher对应的组件实例是否存在beforeUpdate钩子函数,如果存在则执行。
  2. 在数据更新流程中的作用
    • 主要用于在数据更新,但DOM还未更新之前执行一些操作。例如,可以在此钩子函数中做一些数据的预处理,或者在更新DOM前记录一些状态信息等。比如,一个列表组件在数据更新前,记录当前列表的滚动位置,以便在DOM更新后可以恢复到相同位置。
  3. 底层实现差异(与updated对比)
    • beforeUpdate执行在数据变化后,DOM更新前。它主要依赖于Watcher的update方法触发,通过遍历_watchers数组,找到组件实例的beforeUpdate钩子并执行。

updated钩子函数

  1. 实现原理
    • 当Watcher执行完update方法中所有的DOM更新操作后,会触发updated钩子函数。
    • Vue在完成DOM更新后,会遍历当前组件实例的_watchers数组,检查组件实例是否存在updated钩子函数,如果存在则执行。
  2. 在数据更新流程中的作用
    • 用于在数据和DOM都更新完成后执行操作。比如可以在此时进行一些需要依赖最新DOM状态的操作,像重新初始化第三方插件(因为插件可能依赖最新的DOM结构),或者进行一些基于最新DOM状态的计算等。
  3. 底层实现差异(与beforeUpdate对比)
    • updated执行在数据变化且DOM更新完成之后。它是在Watcher完成所有DOM更新相关操作后,通过遍历_watchers数组触发执行,而beforeUpdate是在DOM更新操作前执行。