Vue生命周期及各组件间的执行情况

文章目录

  • 前言
  • 一、Vue的生命周期是什么?
  • 二、Vue生命周期中具体过程
    • 1.Vue生命周期中的函数
      • 创建Vue实例期阶段:
      • 运行阶段:
      • 销毁阶段:
    • 2.加入keep-alive后
      • 1)keep-alive的认识:
      • 2)keep-alive的用法:
  • 各组件间的执行情况
    • 1.加载渲染过程
    • 2.子组件更新过程
    • 3.父组件更新过程
    • 4.组件销毁过程
    • 5.过程演示
  • 总结


前言

Vue的生命周期,各个组件间的执行情况。
注:本文是以Vue2.x版本展开叙述


一、Vue的生命周期是什么?

Vue的组件都是独立存在的,每个组件都要经历他自己的生命周期。Vue的生命周期是指组件:
创建—>数据初始化—>挂载—>更新—>销毁
简单的来说就是组件从创建到销毁之间的过程

二、Vue生命周期中具体过程

1.Vue生命周期中的函数

生命周期钩子也叫生命周期函数也叫生命周期事件,vue中他自己携带了八个生命周期函数,如下:

创建Vue实例期阶段:

  • beforeCreate:
    实例刚在内存中被创建出来,此时,还没有初始化完成data和methods属性。

  • created:
    实例已经在内存中创建完成,此时data和menthods以及创建完成,但没有开始编译模板。

  • beforeMount:
    此时完成了模板的编译,但没有进行挂载。

  • mounted:
    此时已经完成挂载到指定容器中显示了。

运行阶段:

  • beforeUpdate:
    状态更新之前调用此函数,此时data中的状态值是最新的,但在界面上并没有得到更新,还没有开始重新渲染DOM节点。
  • updated:
    实例更新完成后调用此函数,此时以及重新渲染好DOM节点,界面显示数据也是最新的。

销毁阶段:

  • beforeDestroy:
    实例 销毁前调用的函数,此时,实力还是完全可用的。
  • destroyed:
    实例销毁后调用,实例锁指示的所有东西都将解绑,所有监听器将移除,所有子实例也将销毁。

生命周期流程图:
Vue生命周期及各组件间的执行情况_第1张图片

代码演示:

 var app = new Vue({
        el: "#app",
        data: {
            message: "Hello Vue!"
        },
        methods: {
            changeMessage() {
                this.message='改变了!'
            }
        },
        beforeCreate() {
            console.log("---------- 初始化前 beforeCreate-----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
            
        },
        created() {
            console.log("---------- 初始化完成 created----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
        },
        beforeMount() {
            console.log("---------- 挂载前 beforeMount----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
        },
        mounted() {
            console.log("---------- 挂载完成 mounted----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
        },
        beforeUpdate() {
            console.log("---------- 更新前 beforeUpdate----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
        },
        updated() {
            console.log("---------- 更新完成 updated----------");
            this.message===undefined?console.log('message没拿到'):console.log(this.message);
            this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
        }
    });

创建阶段运行结果:

Vue生命周期及各组件间的执行情况_第2张图片
可以看到首次加载只会运行前四个周期函数,在挂载前才能拿到el属性,如果要操作DOM节点最早在挂在完成 mounted中操作。

运行阶段运行结果:

Vue生命周期及各组件间的执行情况_第3张图片

2.加入keep-alive后

1)keep-alive的认识:

是vue自带的内部组件,是用来缓存组件的,达到提升性能的目的。
当使用keep-alive后会增加两个生命周期函数:

  • activated
    keep-alive 组件激活时调用, 该钩子函数在服务器端渲染期间不被调用。
    承担原来created钩子中获取数据的任务
    在第一次进入keep-alive包裹的组件时,会调用 beforeCreate、created、beforeMount、mounted、activated;这五个生命周期函数。
    当第二次或第n次进入时只会调用activated

  • deactivated
    在 keep-alive 组件停用时调用,该钩子在服务器端渲染期间不被调用。

2)keep-alive的用法:

Props有三个include、exclude、max。

  • include
    使用字符串或者正则表达式,匹配的组件才会被缓存
  • exclude
    使用字符串或者正则表达式,匹配的组件都不会被缓存
  • max
    以数字的形式记录可以缓存多少个组件实例,到达这个值后再次缓存时将销毁最久未使用的组件实例。

各组件间的执行情况

1.加载渲染过程

过程:
父组件beforeCreate --> 父组件created --> 父组件beforeMount --> 子组件beforeCreate --> 子组件created --> 子组件beforeMount --> 子组件mounted --> 父组件mounted

2.子组件更新过程

过程:
子组件beforeUpdate --> 子组件updated

3.父组件更新过程

父组件beforeUpdate --> 父组件updated

4.组件销毁过程

父组件beforeDestroy --> 子组件beforeDestroy --> 子组件destroyed --> 父组件destroyed

5.过程演示

父组件代码

<template>
  <div style="border: 2px #1E1E1E; height: 500px;width: 500px;background-color: blueviolet; text-align: center">
    <span>{{message}}</span>
    <button @click="changef" >父组件改变</button>
    <Son></Son>
    <button @click="destroy">点击销毁</button>
  </div>
</template>

<script>
import Son from './components/Son.vue'

export default {
  name: 'App',
  components: {
    Son
  },
  data() {
    return {
      message: "父组件"
    }
  },
  methods: {
    changef(){
      this.message='父组件改变了'
    },
    destroy(){
      this.$destroy();
      console.log('销毁完成');
    }
  },
  beforeCreate() {
    console.log("---------- 父组件初始化前 beforeCreate-----------");


  },
  created() {
    console.log("---------- 父组件初始化完成 created----------");

  },
  beforeMount() {
    console.log("---------- 父组件挂载前 beforeMount----------");

  },
  mounted() {
    console.log("---------- 父组件挂载完成 mounted----------");

  },
  beforeUpdate() {
    console.log("---------- 父组件更新前 beforeUpdate----------");
  },
  updated() {
    console.log("---------- 父组件更新完成 updated----------");
  },
  beforeDestroy(){
    console.log('---------- 父组件销毁前 beforeDestroy----------');
  },
  destroyed(){
    console.log('---------- 父组件销毁后 destroyed----------')
  }
}
</script>

子组件代码

<template>
  <div>
    <div style="border: 2px #1E1E1E; height: 200px;width:200px;background-color: aqua;">
      <span>{{message}}</span>
      <button @click="changes">子组件改变</button>
    </div>
  </div>
</template>

<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: 'Son',
  props: {

  },
  data() {
    return {
      message: "子组件"
    }
  },
  methods: {
    changes(){
      this.message='子组件改变了'
    }
  },
  beforeCreate() {
    console.log("---------- 子组件初始化前 beforeCreate-----------");


  },
  created() {
    console.log("---------- 子组件初始化完成 created----------");

  },
  beforeMount() {
    console.log("---------- 子组件挂载前 beforeMount----------");

  },
  mounted() {
    console.log("---------- 子组件挂载完成 mounted----------");

  },
  beforeUpdate() {
    console.log("---------- 子组件更新前 beforeUpdate----------");
  },
  updated() {
    console.log("---------- 子组件更新完成 updated----------");
  },
  beforeDestroy(){
    console.log('---------- 子组件销毁前 beforeDestroy----------');
  },
  destroyed(){
    console.log('---------- 子组件销毁后 destroyed----------')
  }
}
</script>

加载渲染:
Vue生命周期及各组件间的执行情况_第4张图片

更新阶段:
Vue生命周期及各组件间的执行情况_第5张图片

销毁阶段:
Vue生命周期及各组件间的执行情况_第6张图片

总结

  • 生命周期:
    • 又名:生命周期回调函数、生命周期函数、生命周期钩子。
    • 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
    • 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
    • 生命周期函数中的this指向是vm 或 组件实例对象。

  • 常用的生命周期钩子:
    • mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
    • beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

  • 关于销毁Vue实例:
    • 销毁后借助Vue开发者工具看不到任何信息。
    • 销毁后自定义事件会失效,但原生DOM事件依然有效。
    • 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

你可能感兴趣的:(vue学习,vue.js,javascript,前端)