面试题 -- Vue 的生命周期?

Ray Shine 2022/8/5 Vue

# 背景

Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载 Dom -> 渲染、更新 -> 渲染、卸载 等⼀系列过程,称这是 Vue 的⽣命周期。

# 1. beforeCreate

创建前:数据观测和初始化事件还未开始,此时 data 的响应式追踪、event/watcher 都还没有被设置,也就是说不能访问到 datacomputedwatchmethods 上的方法和数据。

# 2. created

创建后:实例创建完成,实例上配置的 options 包括 datacomputedwatchmethods 等都配置完成,但是此时渲染得节点还未挂载到 DOM,所以不能访问到 $el 属性。

# 3. beforeMount

挂载前:在挂载开始之前被调用,相关的 render 函数首次被调用。实例已完成以下的配置:编译模板,把 data 里面的数据和模板生成 html。此时还没有挂载 html 到页面上。

# 4. mounted

挂载后:在 el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的 html 内容替换 el 属性指向的 DOM 对象。完成模板中的 html 渲染到 html 页面中。此过程中进行 ajax 交互。

# 5. beforeUpdate

更新前:响应式数据更新时调用,此时虽然响应式数据更新了,但是对应的真实 DOM 还没有被渲染

# 6. updated

更新后:在由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。此时 DOM 已经根据响应式数据的变化更新了。调用时,组件 DOM 已经更新,所以可以执行依赖于 DOM 的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。

该钩子在服务器端渲染期间不被调用。

# 7. beforeDestroy

销毁前:实例销毁之前调用。这一步,实例仍然完全可用,this 仍能获取到实例。

# 8. destroyed

销毁后:实例销毁后调用,调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

该钩子在服务端渲染期间不被调用。

注意

另外还有 keep-alive 独有的生命周期,分别为 activateddeactivatedkeep-alive 包裹的组件在切换时不会进行销毁,而是缓存到内存中并执行 deactivated 钩子函数,命中缓存渲染后会执行 activated 钩子函数。

最后更新时间: 2022/12/6 13:31:05
ON THIS PAGE