1、什么是vue生命周期?
生命周期是指一个组件从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段
从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。
生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行
注意:生命周期函数强调的是时间段,生命周期函数强调的是时间点
2、vue生命周期总共有几个阶段?
3个阶段
总共分为8个过程:创建前/后, 载入前/后,更新前/后,销毁前/后。
vue运行原理
一个vue组件本质上也是一个vue实例,webpack从main.js开始执行
webpack发现main.js中用到了App组件,package.json中的 "vue-template-compiler"开始解析渲染App根组件,
在解析App根组件时,它也会编译创建App根组件中使用的MyProduct和MyChild两个组件,
若MyProduct和MyChild组件中使用了其他组件,则它也会继续创建。
最终webpack解析出一棵DOM树,然后进行编译转换成纯 js 文件,插入首页中由浏览器进行解析与渲染
2.1 创建
① beforeCreate(创建前):数据观测和初始化事件还未开始。
② created(创建后):完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来。
可以理解为template中使用一个组件就创建一个Vue实例
beforeCreate()函数不重要,因为用不了props、data、methods
--------------------------------------------------------------------------------------------------------------------------------
created()阶段可以使用props、data、methods的数据
可以发起Ajax请求去获取数据
Ajax请求成功后获取到的数据将会被渲染到模板结构中
---------------------------------------------------------------------------------------------------------------------------------
但是 create() 阶段模板结构还未生成,所以不能在此阶段操作DOM元素
判断是否有 el 选项
<===>
③ beforeMount(载入前):在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,data里面的数据和模板生成html。注意此时还没有挂载html到页面上。
由于beforeMount()阶段还没有渲染模板结构,也无法操作DOM元素,所以该阶段也不重要
④ mounted(载入后):在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。(第一次把DOM结构渲染好)
总结
服务器数据请求最早可以在created()阶段
操作DOM元素最早可以在mounted()阶段
2.2 运行(元素或组件的变更操作)
⑤ beforeUpdate(更新前):在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重复渲染过程。
⑥ updated(更新后):在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
运行阶段的函数最少执行0次,最多执行无数次
2.3 销毁(销毁相关属性)
⑦ beforeDestroy(销毁前):在实例销毁之前调用。实例仍然完全可用。
⑧ destroyed(销毁后):在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
3、Vue实例的产生过程
① beforeCreate 在实例初始化之后,数据观测和事件配置之前被调用。
② created 在实例创建完成后被立即调用。
props、data、methods都可用
③ beforeMount 在挂载开始之前被调用。
④ mounted el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子。
第一次把DOM结构渲染好,可以第一次操作DOM元素
⑤ beforeUpdate 数据更新时调用,发生在虚拟DOM打补丁之前。
⑥ updated 由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。
可以操作最新的更新过后的DOM
⑦ beforeDestroy 实例销毁之前调用。
⑧ destroyed 实例销毁后调用
new Vue
(1)new Vue会调用Vue原型链上的_init方法对Vue实例进行初始化;
(2)首先是初始化生命周期,对Vue实例内部的一些属性(children、parent、isMounted)进行初始化;
(3)initEvents,初始化当前实例上的一些自定义事件(Vue.$on);
(4)解析slots绑定在Vue实例上,绑定createElement方法在实例上;
(5)完成对生命周期、自定义事件等一系列属性的初始化后,触发生命周期钩子beforeCreate;
(6)在初始化data和props之前完成依赖注入;
(7)完成对data和props的初始化,同时对属性完成数据劫持内部,启用监听者对数据进行监听(更改);
(8)对依赖注入进行解析;
(9)完成对数据的初始化后,触发生命周期钩子created;
(10)进入挂载阶段,将vue模板语法通过vue-loader解析成虚拟DOM树,虚拟DOM树与数据完成双向绑定,触发生命周期钩子beforeMount;
(11)将解析好的虚拟DOM树通过vue渲染成真实DOM,触发生命周期钩子mounted。
4、vue生命周期的作用是什么?
它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。
5、第一次页面加载会触发哪几个钩子?
会触发 下面这几个beforeCreate, created, beforeMount, mounted 。
6、DOM 渲染在 哪个周期中就已经完成?
DOM 渲染在 mounted 中就已经完成了。