从零开始构建一个Vue项目

Vue五、Vue生命周期的理解以及各个阶段的应用

2020-02-23  本文已影响0人  好一只帅卤蛋

我刚开始学框架的时候听到最多的应该就是生命周期这几个字眼了。
对于生命周期我的理解是:就是一个vue实例从开始创建到数据渲染等操作完成到最后销毁的过程。
简单来说就是你写的组件从打开的那一刻起到消失的那一刻止,中间经历的所有过程。

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>

三、思考

(1)、初始化是什么意思,销毁的具体表现在哪里?

(2)、vue底层是如何实现生命周期的,很奇妙的东西?

上一篇下一篇

猜你喜欢

热点阅读