记得博主第一次看生命周期钩子官方API时,第一印象是,讲的非常详细、条理清晰,但是博主还是没完全搞懂,于是经过自己的学习之后通俗易懂的总结一下:
首先,先上一张官方生命周期图示,大家可以参考理解

博主写了一个小demo,通过这个例子来进行讲解会比较易懂
可以点击测试demo查看效果
helloWorld.vue
<template>
<div class="hello">
<ul>
<li v-for="(user,index) in users" :key="index" @click="user.show = !user.show">
<h2>{{user.name}}</h2>
<h3 v-show="user.show">{{user.job}}</h3>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
users: [
{ name: "saber", job: "sword", show: false },
{ name: "archar", job: "arrow", show: false },
{ name: "saber", job: "sword", show: false },
{ name: "archar", job: "arrow", show: false },
{ name: "saber", job: "sword", show: false },
{ name: "archar", job: "arrow", show: false },
{ name: "saber", job: "sword", show: false },
{ name: "archar", job: "arrow", show: false }
]
};
},
beforeCreate () {
alert("组件实例化之前执行的函数");
},
created() {
alert("组件实例化完毕,但页面还未显示");
},
beforeMount () {
alert("组件挂载前,页面仍未展示,但虚拟DOM已经配置");
},
mounted() {
alert("组件挂载后,此方法执行后页面显示");
},
beforeUpdate() {
alert("组件更新前,页面仍未更新,但虚拟DOM已经配置");
},
updated () {
alert("组件更新,此方法执行后,页面更新");
},
beforeDestroy () {
alert("组件销毁前");
},
destroyed() {
alert("组件销毁")
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello{
width: 100%;
max-width: 1200px;
box-sizing: border-box;
margin: 40px auto;
}
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
display: flex;
flex-wrap: wrap;
padding: 0;
}
li {
flex-grow: 1;
flex-basis: 200px;
border: 1px solid black;
margin:40px ;
}
</style>
home.vue
<template>
<div class="home">
<HelloWorld v-if="destroy" msg="Welcome to Your Vue.js App"/>
<button @click="del">销毁组件</button>
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
data () {
return {
destroy:true
}
},
name: 'home',
components: {
HelloWorld
},
methods: {
del:function(){
this.destroy = false;
}
},
}
</script>
App.vue入口中主要写了路由配置,如果还不了解路由配置的同学,可以查看博主之前的博客,有详细讲解
动图演示

每个周期详解(包括每个过程的运行效果图)
注: 运行截图为依次点击确定按钮后依次截的图
beforeCreate(组件实例化之前执行的方法)
- 还没有将当前的vue对象创建出来时可以调用,只是对当前的事件进行配置,还没有识别属性里的东西(比如data里的数据)
- 在这一般可以做一些过渡、动画加载
ex:

如上图所示,页面正处于beforeCreate阶段,等待完成
created(组件实例化完毕,但页面还未渲染)
- 这里实例已经出来啦,当前组件已经被创建好,属性也成功绑定,但是DOM在这个方法调用的时候还是没有被渲染出来
- 这里通常可以用来获取一些数据,比如获取网络接口,将其数据赋值给相应的属性;
- 这里也可以结束beforeCreate方法中的loading加载事件,准备渲染DOM
注意: 根据上面的生命周期图可以看出,在这个方法后会检查有没有el或者.$mount属性,如果没有,生命周期结束,若有,继续向下检查有没有两种template中的一种(组件或者html),如果有,执行render函数进行渲染(但是此时DOM并不会呈现出来),如果没有,则生命周期结束。
ex:

如上图所示,页面正处于created阶段
beforeMount(组件挂载前,页面仍未渲染,但虚拟DOM已经配置)
- 开始在虚拟DOM中编译之前template中的内容,当前还是没有将内容渲染到页面上,仍然看不见内容。
ex:

在此阶段,虚拟DOM已经配置,但页面仍未渲染完成
mounted(组件挂载后,此方法执行后页面显示)
- 开始挂载之前编译的模板,此方法结束后,页面就渲染完成,内容便显示出来啦。
- 若果有一些东西想在页面显示出来之后进行操作,就可以写在这里,比如说从后台获取数据就可以写在这里
ex:

当点击确定后,即此方法执行后,页面渲染完成

beforeUpdate(组件更新前,页面仍未更新,但虚拟DOM已经配置)
- 数据更新时调用,发生在虚拟 DOM 打补丁之前。
- 这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
ex:
当点击名字更新详情时,处于此阶段,页面仍未更新,页面内容未改变

updated(组件更新,此方法执行后,页面更新)
- 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,当这个方法被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作
- 在大多数情况下,应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之,否则容易出错。
ex:

当点击确定后,即此方法执行后,页面更新

beforeDestroy
- 实例销毁之前调用。在这一步,实例仍然完全可用。
ex:
点击销毁组件按钮后

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

到此就结束啦
以上均为博主在学习中的自我总结,希望能对大家有所帮助,若有问题,请联系博主解决,谢谢
本文通过一个具体示例,详细解析了Vue.js中各个生命周期钩子的触发时机及其应用场景,帮助读者更好地理解和运用Vue生命周期。
2398

被折叠的 条评论
为什么被折叠?



