Vue2 生命周期
生命周期图示
创建阶段
↓
beforeCreate
↓
created
↓
beforeMount
↓
mounted
↓
更新阶段(数据变化时)
↓
beforeUpdate
↓
updated
↓
销毁阶段
↓
beforeDestroy
↓
destroyed
生命周期钩子详解
beforeCreate
在实例初始化之后,数据观测和事件配置之前被调用。
beforeCreate() {
console.log('beforeCreate')
console.log(this.message) // undefined
}
created
实例创建完成后被立即调用。此时已完成数据观测、属性和方法的运算、watch/event 事件回调。
created() {
console.log('created')
console.log(this.message) // 可以访问
// 适合进行 API 调用
this.fetchData()
}
beforeMount
在挂载开始之前被调用,相关的 render 函数首次被调用。
beforeMount() {
console.log('beforeMount')
console.log(this.$el) // undefined
}
mounted
实例被挂载后调用,此时 el 被新创建的 vm.$el 替换。
mounted() {
console.log('mounted')
console.log(this.$el) // 可以访问 DOM
// 适合进行 DOM 操作
this.$refs.input.focus()
}
beforeUpdate
数据更新时调用,发生在虚拟 DOM 打补丁之前。
beforeUpdate() {
console.log('beforeUpdate')
console.log('DOM 还未更新')
}
updated
由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。
updated() {
console.log('updated')
console.log('DOM 已更新')
}
beforeDestroy
实例销毁之前调用。此时实例仍然完全可用。
beforeDestroy() {
console.log('beforeDestroy')
// 清理定时器、取消订阅等
clearInterval(this.timer)
}
destroyed
实例销毁后调用。此时所有的事件监听器会被移除,所有的子实例也会被销毁。
destroyed() {
console.log('destroyed')
}
实际应用场景
API 调用
created() {
this.fetchUserData()
},
methods: {
async fetchUserData() {
const response = await fetch('/api/user')
this.userData = await response.json()
}
}
DOM 操作
mounted() {
this.$refs.chart.init()
this.initThirdPartyLibrary()
}
定时器管理
data() {
return {
timer: null
}
},
mounted() {
this.timer = setInterval(() => {
this.updateTime()
}, 1000)
},
beforeDestroy() {
if (this.timer) {
clearInterval(this.timer)
}
}
事件监听
mounted() {
window.addEventListener('resize', this.handleResize)
},
beforeDestroy() {
window.removeEventListener('resize', this.handleResize)
}
父子组件生命周期顺序
加载渲染过程
父 beforeCreate
父 created
父 beforeMount
子 beforeCreate
子 created
子 beforeMount
子 mounted
父 mounted
更新过程
父 beforeUpdate
子 beforeUpdate
子 updated
父 updated
销毁过程
父 beforeDestroy
子 beforeDestroy
子 destroyed
父 destroyed
注意事项
- 不要在生命周期钩子中使用箭头函数
mounted不保证所有子组件也都被挂载完成updated不保证所有子组件也都被重新渲染完毕- 避免在
updated中修改状态,可能导致无限循环