Vue.js 的生命周期是指 Vue 实例从创建到销毁所经历的一系列阶段。每个阶段都有特定的钩子函数,可以在这些钩子函数中执行相应的逻辑。以下是 Vue.js 生命周期的详细图示及其关键点:
Vue.js 生命周期图示
创建阶段 -> 挂载阶段 -> 更新阶段 -> 销毁阶段
各阶段详细说明及钩子函数
创建阶段
- beforeCreate
- 实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
- 此时无法访问
data
和 methods
。
- created
- 实例已经创建完成之后被调用。
- 此时已完成数据观测,属性和方法的运算,
watch/event
事件回调。但尚未挂载,$el
属性还不可见。
挂载阶段
- beforeMount
- 在挂载开始之前被调用,相关的
render
函数首次被调用。 - 此时模板编译完成,但尚未将编译好的模板挂载到页面上。
- mounted
- 实例被挂载后调用,此时
el
被新创建的 vm.$el
替换。 - 如果根实例挂载到了一个文档内的元素上,当
mounted
被调用时 vm.$el
也在文档内。
更新阶段
- beforeUpdate
- 数据更新时调用,发生在虚拟 DOM 打补丁之前。
- 这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
- updated
- 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
- 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
销毁阶段
- beforeDestroy
- 实例销毁之前调用。在这一步,实例仍然完全可用。
- 可以在这一步做一些清理工作,比如清除定时器或解绑全局事件。
- destroyed
- Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
应用场景示例
- created: 在这个阶段获取数据,因为它比
mounted
更早执行,可以更早地获取数据并渲染页面。 - mounted: 如果你需要操作 DOM 或者依赖于 DOM 的第三方库,应该在这个阶段进行。
- updated: 当数据变化导致组件重新渲染时,可以使用此钩子来观察数据变化后的 DOM 状态。
- beforeDestroy: 清除定时器或取消网络请求等清理工作适合在此阶段进行。
遇到问题的原因及解决方法
问题: 组件更新后没有触发 updated
钩子。
原因: 可能是因为数据更新不是响应式的,或者是在 updated
钩子内部进行了数据更新,形成了无限循环。
解决方法:
- 确保所有用于更新的数据都是响应式的。
- 避免在
updated
钩子内部直接修改触发更新的属性。
通过理解 Vue.js 的生命周期及其钩子函数,可以更有效地管理组件的状态和行为,优化应用的性能和用户体验。