生命周期(Vue2)

生命周期:

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

Vue 从创建开始,然后经历 初始化事件,开始数据代理,解析模板,挂载DOM,渲染,更新(跳回去渲染),销毁。整理生命周期会有几个钩子,方便在适当时时机做一些操作。

1、Init Events & Lifecycle

  • 初始化生命周期、事件,但数据代理还未开始

2、beforeCreate

  • 无法通过vm访问到data中的数据、methods中的方法

3、Init injecttions & reactivity

  • 初始化:数据监测、数据代理

4、Created

  • 此时可以通过vm访问到data中的数据、methods中的方法

5、判断是否传入el

此阶段Vue开始解析模板,生成虚拟dom(内存中),页面还不能显示解析好的内容

  1. 如果传入el

    • 判断是否传入template

      • 如果传入template

        将传入的div标签作为模板,并且会替代传入的el模板

        <!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
          <title>Document</title>
        </head>
        <body>
          <div id="app">
            <h1>{{num}}</h1>
          </div>
        </body>
        <script>
          new Vue({
            el: '#app',
            template:`
              <div id='root'>
                <h1>{{num}}</h1>
              </div>
            `,
            data() {
              return {
                num:1
              }
            },
          })
        </script>
        </html>
        

        image-20220228191842417.png

      • 如果没有传入template

        默认将传入的el当作模板

        <!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
          <title>Document</title>
        </head>
        <body>
          <div id="app">
            <h1>{{num}}</h1>
          </div>
        </body>
        <script>
          new Vue({
            el: '#app',
          })
        </script>
        </html>
        

        image-20220228191619607.png

  2. 如果没有传入el

    • 没有传入el模板时,不会解析模板,并且不会继续执行挂载流程

      <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
        <title>Document</title>
      </head>
      <body>
        <div id="app">
          <h1>{{num}}</h1>
          <button @click="num++">点击num+1</button>
        </div>
      </body>
      <script>
        new Vue({
          // el: '#app',
          data() {
            return {
              num: 1
            }
          },
          beforeCreate() {
            console.log('beforeCreate', this);
          },
          created() {
            console.log('created', this);
          },
          beforeMount() {
            console.log('beforeMount', this);
          },
          mounted() {
            console.log('mounted', this);
          },
        })
      </script>
      </html>
      

      image-20220228192421318.png

    • 此时如果调用**vm.$mount(‘xxx’)**传入需要解析的模板,会继续执行挂载流程

      image-20220228193709915.png

6、beforeMount

  • 页面呈现的时未经Vue编译的dom结构
  • 所有对dom的操作,最终都不奏效

7、Create vm.$el and replace “el” with it

  • 将内存中的 虚拟dom 转为 真实dom插入页面并创建$el字段保存真实dom

8、mounted

  1. 此时:
    • 页面中呈现的是经给Vue编译的dom
    • 对dom的操作均有效(尽可能避免操作dom)
  2. 至此初始化过程结束,一般在此进行:开启定时器、发送网络请求、订阅消息、绑定自定义事件、等初始化操作

9、更新流程

9.1、beforeUpdate

  • 此时:数据是新的,但页面是旧的,即:页面尚未和数据保存同步

9.2、Virtual Dom re-render and patch

  • 根据新数据,生成新的虚拟dom(内存中),随后与旧的虚拟dom(内存中)进行比较,最终完成页面更新,即:完成了Modal --> View的更新

9.3、updated

  • 此时:数据是新的,页面也是最新的。即:页面和数据保持同步

10、销毁流程

  1. 当vm上的$destroy被调用的时候,开始走销毁流程

    image-20220228195818072.png

  2. beforeDestroy

    此时:vm中所有的:data、methods、指令等等,等处于可用状态,马上要执行销毁流程

    一般在此阶段:关闭定时器、取消订阅消息、解绑自定义事件等收尾工作

    此阶段会更新数据,但是不会更新页面

  3. Teardown watchers,child components and event listeners

    移除所有的监听,子组件和事件监听器

  4. destroyed

    所有的事件监听器,子实例都会被销毁。该钩子在服务器端渲染期间不被调用。

    vue生命周期


生命周期(Vue2)
http://localhost:8090//archives/vue2-lifecycle
作者
龟龟
发布于
2020年12月18日
更新于
2024年08月28日
许可协议