什么是Vue生命周期?
Vue 组件生命周期是 Vue 实例从创建到销毁所经过的一系列阶段,每个阶段都有相应的钩子函数可以被调用。通过使用这些钩子函数,我们可以在组件的不同生命周期中进行启动和关闭各种操作。
生命周期详细图解
首先让我们先来看一张图示,从图上,我们再一步一步来理解vue生命周期。
根据图解得出Vue 组件的生命周期可以分为 8 个阶段
- beforeCreate:在实例刚被创建的时候调用。此时,实例的属性和方法还未初始化完成,且无法访问 data、computed 等属性。
- create:在实例创建完成后调用。在此阶段,实例已经完成了数据观测等基本的配置,但并未开始模板编译和挂载过程,因此不能访问$el 属性,而关联的 DOM 元素也还未被生成。
- beforeMount:在模板编译/挂载之前被调用。此时虚拟 DOM 抽象语法树已经生成,但是还没有渲染成真实 DOM 节点。此时可以访问关联的 DOM 元素,并对元素进行一些简单的操作。
- mounted:在模板编译/挂载到 DOM 中之后被调用。此时视图已经渲染完毕,数据和事件都已经绑定好了。mounted 钩子函数通常用来进行一些任务初始化操作,如通过 HTTP 请求从服务器读取数据等。
- beforeUpdate:在组件更新之前被调用,发生在虚拟 DOM 重新渲染和打补丁之前。此时组件 data 数据已经更新,该阶段非常适合执行需要更新数据的操作,但是不能修改数据本身。
- updated:在组件更新之后被调用,发生在虚拟 DOM 重新渲染和打补丁之后。此时更新视图的过程已完成,DOM 已经重新渲染完毕。此时可以获取到更改后的 DOM 值,对比旧值进行渲染和更新等操作
- beforeDestroy:在实例销毁之前调用。在这个阶段,实例仍然可用,你可以做一些销毁前的清理工作,如解除事件监听器、清除计时器等。
- destroyed:实例已经销毁后调用。在这个期间,事件监听器和观察者已经被移除了,内存已经被释放,所有下级组件实例以及当前实例中的所有指令都已经解绑。在这个阶段,应该清除所有关联变量,防止内存泄漏。
常用的生命周期钩子:
-
created:组件实例创建完成后被调用,此时组件的属性和方法已经初始化完成,但是还未挂载到 DOM 上。
-
mounted:组件挂载到 DOM 后执行,此时组件渲染完成,相关的 DOM 元素都可以访问到,可以进行一些需要操作 DOM 元素的操作或请求服务器数据的操作。
-
updated:组件更新之后被调用,可以在这里对更新后的数据进行相应的处理,同时也可以进行其他方面的工作,例如操作 DOM 元素、向后端发送请求等。
Vue生命周期示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue生命周期示例</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button @click="clickCounter()">点击</button>
<button @click="destory">点击销毁</button>
<p>{{ count }}</p >
</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data:{ count: 1 },
methods:{
clickCounter(){
this.count += 1
},
destory(){
console.log('bye')
this.$destroy()
}
},
created: function(){
console.log('2. 实例已经创建')
},
beforeCreate: function(){
console.log('1. 实例初始化')
},
mounted:function(){
console.log('4. 挂载到实例')
},
beforeMount:function(){
console.log('3. 挂载开始之前')
},
beforeUpdate: () => {
console.log('数据更新时调用')
},
updated:function(){
console.log('更新数据重新渲染DOM')
},
beforeDestroy:function(){
console.log('实例销毁之前调用')
},
destroyed:function(){
console.log('实例销毁之后调用')
}
})
/*点击页面销毁vue对象, 销毁之后实例将会释放*/
// 销毁之后,再次点击就不起作用了 document.onclick=function(){ app.$destroy(); }; </script>
</body>
</html>
Vue生命周期注意事项
-
避免在 created生命周期钩子函数中直接修改数据。因为在该钩子函数中,组件实例已经创建并初始化属性和方法,但此时还未挂载到 DOM 上,所以直接修改数据不会触发重新渲染。
-
在 mounted生命周期钩子函数中进行 DOM 操作时应该确保相关的元素已经被渲染出来,否则可能会导致操作失败或出现不可预期的结果。
-
避免无限制地监听数据变化。在beforeDestroy生命周期钩子函数中,一定要及时清除所有监听器,以避免内存泄漏和性能问题。
-
在使用keep-alive时,应该了解其缓存机制,并正确处理与该组件相关的状态和数据等。
-
尽量避免在updated生命周期钩子函数中再次更新数据,因为这可能会引起死循环。
-
如果一个组件不再被使用,可以调用vm.$destory()方法销毁它,并释放相应的资源。
-
如果有一些需要异步加载的数据,可以在created和mounted钩子函数中配合使用异步请求,以确保数据加载完毕后再进行后续操作。
需要注意的是,以上只是一些常见的开发问题和注意事项,并不能覆盖所有的情况。在实际开发时,应该根据具体的场景和需求选择合适的生命周期钩子函数以及处理方式,并遵守 Vue.js 的相关规范和推荐,以确保应用的稳定性、可维护性和可扩展性。