无论我们在学习vue中,还是面试当中。vue的生命周期都是我们必须要清楚的。这样更有利你学习vue的使用。通过简单一张图,带你全面认识vue的生命周期。
Vue的生命周期是生命呢?
举个例子:每个人从出生到死亡,这一段时间可以称作是我们的生命。以张三举例。例如:张三从2022年5月23日出生。那么,今天无疑是他一个重要的日子(生日),等到张三结婚,那么无疑也是一个重要时间。等到张三死亡。那么那一天也是他的重要日子。总结:vue的生命周期,就是Vue从出生到死亡的一些重要的时间,我们将Vue的这些重要时间,称作Vue的生命周期函数,也叫Vue的钩子函数。
Vue生命周期一共分为四个阶段:
-
初始化 => 创建组件 => beforeCreate created
-
挂载 => 渲染显示组件 => beforeMount mouted
-
更新 => 修改了变量 => 触发视图刷新 => beforeUpdate updated
-
销毁 => 切换页面 => 会把组件对象从内存删除 => beforeDestory destoryed
如下图官方文档中所展示的生命周期图
我们拆成四个阶段来看这张图。
1.创建阶段
第一个生命周期函数 beforeCreate: 创建前,这时候只是初始化了vue的生命周期,事件。vue的data对象数据,和方法以及一些计算属性全部都还没开始。写了一段代码进行验证。此时vm实例并没有_data属性
beforeCreate() {
console.log('beforeCreate');
console.log(this); // 这时候的this没有_data属性
debugger
},
第二个生命周期函数 created :创建后,还是msg来验证,现在这个阶段created是可以访问data中定义的值,因为实例已经初始化完成了有值了,所以可以拿到。 再着,created可以发送ajax请求。
created() {
console.log('created');
console.log(this);
debugger
},
第二阶段
这个阶段Vue开始解析模板,生成虚拟DOM,但是不能在页面中显示已经解析好了的内容,存储在内存当中。并查看Vue中是否有“el”若没有“el”到这里就直接结束了,后面的代码不执行。显示的代码也是没有经过解析的。当再次调用vm.$mount……页面就会重新解析,再执行代码。
第三阶段
第三个生命周期函数 beforeMount:挂载前: 在挂载开始之前就进行调用,此时还是虚拟DOM,还未真实的展现在页面中,所以此阶段是不能对DOM进行操作的。操作也不会奏效。
beforeMount() {
console.log('beforeMount');
console.log(this);
document.querySelector('h2').innerText = '我改了h2'
debugger // 只有在debugger 时候才能看到我改了h2,等到debugger过后,h2内容将被虚拟DOM覆盖。
},
第四个生命周期函数 mounted: 挂载后:“el”被vm.$el 替换,并挂载到实例上去之后调用该钩子。如果root 实例挂载了一个文档内元素,当mounted被调用是 vm.$el 也在文档内,此时也是可以对DOM进行操作的。
mounted() {
console.log('beforeMount');
console.log(this.$el);
document.querySelector('h2').innerText = '我也改'
},
此时,页面的h2内容变成我也改
第四阶段
第五个生命周期函数 beforeUpdate:更新前:数据更新时调用,发生在虚拟DOM打补丁之前,这里适合更新之前访问现有的DOM,比如手动移除已添加的时间监听器,该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行 。
第六个生命周期函数 updated:更新后:由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。 只会在数据变更之后触发这个钩子函数。
<body>
<div id="app">
<h1>当前n的值:{{n}}</h1>
<h2>哈哈哈哈哈</h2>
<button @click="add">点我n+</button>
<button @click="destroy">点我销毁</button>
</div>
<script>
Vue.config.productionTip = false
new Vue({
el: '#app',
data: {
name: 'Vue.js123',
n: 1
},
methods: {
add() {
this.n++
},
destroy() {
this.$destroy()
}
},
beforeCreate() {
console.log('beforeCreate');
console.log(this); // 这时候的this没有_data属性
// debugger
},
created() {
console.log('created');
console.log(this);
// debugger
},
beforeMount() {
console.log('beforeMount');
console.log(this);
document.querySelector('h2').innerText = '我改了h2'
debugger
},
mounted() {
console.log('beforeMount');
console.log(this.$el);
document.querySelector('h2').innerText = '我也改'
},
beforeUpdate() {
console.log('beforeMount');
console.log(this.n);
// debugger
},
updated() {
console.log('updated');
console.log(this.n);
// debugger
},
当我们点击n++按钮修改n的中,我们就会进入beforeUpdate函数,updated函数。
第五阶段
第七个生命周期函数 beforeDestroy:销毁前:实例销毁之前调用。在这一步,实例任然完全可用。该钩子在服务器端渲染期间不被调用。所以,一般在此阶段: 关闭定时器,取消订阅消息,解绑自定义事件等收尾操作。
第八个生命周期函数:销毁后:Vue实例销毁后调用。调用后,Vue实例指示的所有东西,都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
总结: 常用的生命周期钩子:
1. mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
2. beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。
关于销毁Vue实例
1. .销毁后借助Vue开发者工具看不到任何信息。
2.销毁后自定义事件会失效,但原生DOM事件依然有效。
3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。