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


前言

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:
    实例销毁后调用,实例锁指示的所有东西都将解绑,所有监听器将移除,所有子实例也将销毁。

生命周期流程图:
在这里插入图片描述

代码演示:

 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);
        }
    });

创建阶段运行结果:


可以看到首次加载只会运行前四个周期函数,在挂载前才能拿到el属性,如果要操作DOM节点最早在挂在完成 mounted中操作。

运行阶段运行结果:

在这里插入图片描述

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在关键时刻帮我们调用的一些特殊名称的函数。
    • 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
    • 生命周期函数中的this指向是vm 或 组件实例对象。

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

  • 关于销毁Vue实例:
    • 销毁后借助Vue开发者工具看不到任何信息。
    • 销毁后自定义事件会失效,但原生DOM事件依然有效。
    • 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue生命周期钩子函数指的是在组件实例化、渲染、更新和销毁等不同阶段执行的一些特定函数。下面是 Vue 组件生命周期钩子函数及其执行顺序: 1. beforeCreate:在实例创建之前被调用。此时组件的数据和方法都还未初始化。 2. created:在实例创建完成之后被调用。此时组件的数据已经初始化,但 DOM 还未渲染。 3. beforeMount:在组件挂载到 DOM 之前被调用。此时模板已经编译完成,但还未挂载到页面中。 4. mounted:在组件挂载到 DOM 后被调用。此时组件已经被渲染并插入到页面中,可以进行 DOM 操作。 5. beforeUpdate:在数据更新之前被调用。此时组件还未重新渲染,但数据已经更新。 6. updated:在数据更新之后被调用。此时组件已经重新渲染,可以进行 DOM 操作。 7. beforeDestroy:在组件销毁之前被调用。此时组件还存在,可以进行一些清理工作。 8. destroyed:在组件销毁之后被调用。此时组件已经从 DOM 中移除,事件监听和定时器等资源都已经被销毁。 对于父子组件,它们的生命周期钩子函数的执行顺序如下: 1. 父组件的 beforeCreate 和 created 钩子函数执行。 2. 子组件的 beforeCreate 和 created 钩子函数执行。 3. 子组件的 beforeMount 钩子函数执行。 4. 子组件的 mounted 钩子函数执行。 5. 父组件的 beforeMount 钩子函数执行。 6. 父组件的 mounted 钩子函数执行。 7. 数据更新时,先执行组件的 beforeUpdate 钩子函数,然后执行组件的 beforeUpdate 钩子函数,再执行组件updated 钩子函数,最后执行组件updated 钩子函数。 8. 组件销毁时,先执行组件的 beforeDestroy 钩子函数,然后执行组件的 beforeDestroy 钩子函数,最后执行组件的 destroyed 钩子函数,再执行组件的 destroyed 钩子函数。 这是 Vue 组件生命周期钩子函数的一般执行顺序,但在实际开发中可能会有特殊情况,需要根据具体需求来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天将降大任于我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值