Vue五、Vue生命周期的理解以及各个阶段的应用
2020-02-23 本文已影响0人
好一只帅卤蛋
我刚开始学框架的时候听到最多的应该就是生命周期这几个字眼了。
对于生命周期我的理解是:就是一个vue实例从开始创建到数据渲染等操作完成到最后销毁的过程。
简单来说就是你写的组件从打开的那一刻起到消失的那一刻止,中间经历的所有过程。
一、各个阶段
1 - beforeCreate - 初始化之前
实例刚刚被创建出来,此时, `data` 和 `methods`属性还没有初始化
2 - Created - 创建完成(只触发一次)
在实例创建完成后被立即调用。
在这一步,实例已完成以下的配置:数据观测 (data observer), `data` 和 `methods`属性运算,watch/event 事件回调。
然而,挂载阶段还没开始,`$el `属性目前尚不可用,还没有开始编译。
3 - beforeMount - 挂载之前
此时已经完成了模板的编译,但是还没有开始挂载,相关的`render` 函数首次被调用。
4 - mounted - 实例被挂载后调用
此时,已经将编译好的模板,挂载到了页面指定的容器中显示
5 - beforeUpdate - 数据更新前
状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点.
这里适合在更新之前访问现有的 DOM,比如`手动移除已添加的事件监听器`。
6 - Updated - 被更新之后
实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了!
然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用`computed 或 watcher`取而代之。
7 - activated / deactivated - 被 keep-alive 缓存的组件(激活时/停用时)调用。
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中。
当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
主要用于`保留组件状态或避免重新渲染`。
8 - beforeDestroy - 销毁之前
实例销毁之前调用。在这一步,实例仍然完全可用。
9 - destroyed - 销毁之后
实例销毁后调用。调用后,Vue 实例`指示的所有东西都会解绑定`,所有的`事件监听器会被移除`,所有的`子实例也会被销毁`。
二、实例(在后缀名为.vue
的文件中)
下面的内容都是常用的
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png" />
<HelloWorld msg="Welcome to Your Vue.js App" />
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from "@/components/HelloWorld.vue";
export default {
name: "Home",
data() {
return {};
},
components: {
HelloWorld
},
methods: {
},
// 创建实例期间的四个事件
beforeCreate() {
// 这里 data 和 methods 中的 数据都还没有没初始化
},
created() {
// 在 created 中,data 和 methods 都已经被初始化好了!
// 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作
},
beforeMount() {
// 在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串
},
mounted() {
// 注意: mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的 躺在我们的内存中,一动不动
},
// 接下来的是运行中的两个事件
beforeUpdate() {
// 执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,但是 data 数据是最新的,页面里面和最新的数据还没保持同步
},
updated() {
// updated 事件执行的时候,页面和 data 数据就保持同步了,都是最新的
}
};
</script>