vue2生命周期详解

Posted EchoLiner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue2生命周期详解相关的知识,希望对你有一定的参考价值。

1、vue2生命周期详解

(1)vue实例创建与挂载的过程

👉new Vue();

👉加载生命周期方法以及事件

👉beforeCreate();

👉读取vue的所有配置项:读取vue实例的data属性,data属性需要数据观测;读取配置项computed,methods,watch,components....

⚠️注意:读取computed时,只是读取到computed里面的每个配置项,而里面的函数不会执行,只有当代码访问了这个函数才执行里面的计算。

👉created();

👉判断是否有el配置项

(如果没有el,等待$mount()动态挂载,如果一直不执行挂载,此时实例是创建好了,但是实例的整个生命周期过程走到created就不再往下进行了,也不能操作dom了,只能操作实例本身内容)

👉判断是否有template配置项

(如果没有,把el选择器所对应的dom当成template进行编译)

(如果没有template,提供了render渲染函数,等价于提供了template)

(如果配置项使用template,需要将脚手架工具配置项runtimeCompiler:true)

(如果配置项使用render,没有使用使用template,需要将脚手架工具配置项runtimeCompiler:false,默认值就是false)

⚠️注意:编译模板template:也就是编译template中的值,但是这个值还在js中,还没有去到页面上,页面还是空的<div id="app"></div>

👉beforeMount();

👉将编译好的template替换在el选择器对应的dom结构中

👉mounted();

(2)生命周期有个循环♻️操作:更新

当数据已经发生变化后,再执行以下2个生命周期函数

👉beforeUpdate(); //dom更新前

👉将新的数据渲染在dom结构

👉updated(); //dom更新后

(3)销毁

👉执行$destroy();

👉beforeDestroy();

👉移除数据监听,事件监听,子组件

👉destroyed();

4、vue2生命周期代码示例

import Vue from 'vue'
import App from './App.vue'

var vm = new Vue(
  el: '#app',

  // template: `<div class="wrap">
  //               <h1>title</h1>
  //            </div>`,

  // render: (h)=>h(App),

  data: 
    title: 'App',
    list: []
  ,
  methods: 
    testAction() 
      console.log(this.title);
    
  ,

  beforeCreate() 
    //实例创建前
    console.log('beforeCreate...');
    console.log(this.title);//undefined
    this.testAction();//会报错
  ,
  created() 
    // 实例创建完成,在这个生命周期函数执行之后都可以访问vue实例的配置项上的内容
    // 可以在这个生命周期请求数据,在这可以把请求到的数据复制给data里的某个属性
    console.log('created...');
    console.log(this.title);//有值
    this.testAction();//有值
  ,
  beforeMount() 
    console.log('beforeMount...');
    console.log(document.querySelector('#app'));//可以取到这个dom对象
    console.log(document.querySelector('.wrap'));//null
  ,
  mounted() 
    //挂载
    //操作dom
    console.log('mounted...');
    console.log(document.querySelector('#app'));//null
    console.log(document.querySelector('.wrap'));//可以取到这个dom对象
  ,
  beforeUpdate() 
    console.log('beforeUpdate...');
    console.log(this.title);//与updated()里打印的this.title一样
    console.log(document.querySelector('p:nth-of-type(2)').innerText);//dom更新前的值
  ,
  updated() 
    //更新数据告诉后台
    console.log('updated...');
    console.log(this.title);//与beforeUpdate()打印的this.title一样
    console.log(document.querySelector('p:nth-of-type(2)').innerText);//dom更新后的值
  ,
  beforeDestroy() 
    console.log('beforeDestroy...');
    // 释放资源:闭包的引用等
  ,
  destroyed() 
    console.log('destroyed...');
  

)//.$mount('#app')

setTimeout(() => 
  vm.$destroy();
, 2000);

5、vue2生命周期图示

vue生命周期详解

参考技术A vue生命周期是指vue实例对象从创建之初到销毁的过程,vue所有功能的实现都是围绕其生命周期进行的,在生命周期的不同阶段调用对应的钩子函数实现组件数据管理和DOM渲染两大重要功能。

vue生命周期包括四个阶段,8个钩子函数,作用在某个阶段给你一个做某些处理的机会。

beforeCreate、created、beforeMount,mounted

beforecreate:可以在这加个loading事件,在加载实例的时候触发;
created:初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用;
mounted:挂在元素,获取到DOM节点;
updated:如果对数据统一处理,在这里写上相应函数;
beforeDestory:可以做一个确认停止事件的确认框nextTick,更新数据后立即操作dom;

created不能操作DOM节点,mounted可以操作DOM节点;

created/beforeMount/mounted

创建前/后:在beforeCreated阶段,vue实例的挂载完el还没有。
载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
更新前/后:当data变化时,会触发beforeUpdate和updated方法。
销毁前/后:在执行destroy方法后,对data的改变不会在触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

以上是关于vue2生命周期详解的主要内容,如果未能解决你的问题,请参考以下文章

vue2.0项目实战生命周期和钩子函数详解

vue2生命周期详解

Vue.js 生命周期详解以及使用技巧

Vue.js生命周期的详细介绍

Vue.js常用插件之router路由(上)

uni-app使用Vue.js