vue2生命周期

159 阅读3分钟

首先,生命周期是个啥?

借鉴vue官网的一句话:每一个vue实例从创建到销毁的过程,就是这个vue实例的生命周期。在这个过程中,他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程。那么这些过程中,具体vue做了些啥,我们今天来了解一下。

流程图

了解之前,我们先贴上一张官网的生命周期图,从图上,我们再一步一步来理解vue生命周期。

20201224171705552.png

每个阶段都有两个生命周期钩子函数。

创建阶段beforeCreate,created:

可以看做一个vue实例生命的开始,可以把这一阶段比作组件从受精卵到胚胎的过程,这个阶段 vue组件开始初始化,vue开始观察数据,这个阶段有 beforeCreate 和 created 两个生命周期钩子函数。

挂载阶段beforeMount,mounted

这个阶段是vue实例的出生阶段,这个阶段将实现 DOM 的挂载,这标志着我们可以在浏览器里中看到页面了。

运行阶段beforeUpdate,updated

vue实例不可能一直保持不变,当vue实例中的数据发生改变时,DOM 也会发生变化。

销毁阶段beforeDestroy,destroyed

vue实例的消亡阶段。实例还可以被使用,直到destroyed()

首先,从图上,我们可以看出,他的一个过程是

  1. new Vue()实例化一个vue实例,然后init初始化event 和 lifecycle
  1. 执行beforeCreate生命周期函数
  1. beforeCreate执行完后,会开始进行数据初始化,这个过程,会定义data数据,方法以及事件
  1. 执行created生命周期函数,当这个函数执行的时候,我们已经可以拿到data下的数据以及methods下的方法了
  1. created执行 挂载阶段还没开始,也就是可以使用数据,更改数据,在这里更改数据不会触发updated函数。
  1. 继续往下走,判断当有template参数时,我们会选择去将template模板转换成render函数
  1. 再调用beforMount,也就是说实际从creted到beforeMount之间,最主要的工作就是将模板转换为render函数
  1. 调用beforeMount,开始渲染render函数
  1. 调用mounted,mounted函数内,我们是可以操作dom的,因为这个时候dom已经渲染完成了
  1. 只有当我们状态数据发生变化时,我们再触发beforeUpdat
  1. beforeUpdate调用之后,我们又会重新生成一个新的虚拟dom
  1. 执行updated,所以updated里面也可以操作dom,并拿到最新更新后的dom
  1. 执行beforeDestroy,实例销毁前,也就是说在这个函数内,你还是可以操作实例的
  1. 销毁完成后,再执行destroyed

上代码详细理解一下

<script>
        beforeCreate() {
            console.log('初始化前'//这个时候,在实例被完成创建出来,data没有初始化,不能访问data、method,一般在这个阶段不进行操作。
          
        },
        created () {
            console.log('初始化完成')
            //这个时候,vue实例中的data、method已被初始化,属性也被绑定,但是此时还是虚拟dom,真实dom还没生成,
            //这个时候可以调用data和method的数据及方法,
            //created钩子函数是最早可以调用data和method的,一般在此对数据进行初始化。
          
        },
        beforeMount () {
            console.log('挂载前')
            //此时模板已经编译完成,但还没有被渲染至页面中 在这里可以在渲染前最后一次更改数据的机会,
            //不会触发其他的钩子函数,一般可以在这里做初始数据的获取。
           
        },
        mounted () {
            console.log('挂载完成')
            //此时模板已经被渲染成真实DOM,用户已经可以看到渲染完成的页面,
            //这实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了
           
        },
        beforeUpdate () {
            console.log('更新前')
            //更新前状态(不是data中的数据改变前)重新渲染之前触发,
            //然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染
           
        },
        updated() {
            console.log('更新后')
            //据已经更改完成,dom也重新render完成
           
        },
        beforeDestroy(){
            console.log('销毁前')
            //销毁前执行一般在这里善后:清除计时器、清除非指令绑定的事件等)

        },
       destroyed(){
        console.log('销毁后')
        //Dom元素存在,只是不再受vue控制),卸载watcher,事件监听,子组件。
       
    }
</script>

打完收工。。。

欲知后事如何,敬请期待!!!