[TOC] >[success] # Vue -- 生命周期 ![](https://box.kancloud.cn/e374533874ae3d7e1c4958e407128be3_2498x2798.png) ~~~ 1.从Vue实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期 2.生命周期钩子就是生命周期事件的别名而已; 3.生命周期钩子 = 生命周期函数 = 生命周期事件 ~~~ >[danger] ##### 中文简洁版本 ~~~ 1.看中文简介版本需要对照下面给的代码,根据注解和代码去对应 2.首先要知道,绑定渲染的dom不止有el中绑定形式,还有实例对象调用$mount 3.绑定后会接着往下找看有没有template 设置,有和没有会执行两种,也就是说 有template 就只会渲染template中的内容,并且覆盖掉el中的内容 4.但是即使向第三条那样使用template,el会被覆盖,也必须写el,但是可以不用 再里面写操作,原因是声明周期先找el,在根据渲染el 和template在选择 5.template 只能有一个根元素,想多个就给有if 或者show 弄成单个显示 6.beforeCreate、created、beforeMount、mounted 他们四个是创建生命周期一 条龙,后续当我们去改变数据,这些声明周期都不会在执行,除非刷新页面重新 让生命周期继续; 7.而改变值让页面跟着一起变化的是beforeUpdate 、updated他俩在虚拟dom 中,改变就触发,但最好不用,因为有watch 和计算属性都可以做到,所以这个 生命周期中一般不做操作 8.这里要最重要的说明beforeUpdate 、updated第一次刷新页面的生命周期不执 行。只有数据更新虚拟dom监听到才执行 ~~~ * 对照的代码 ~~~ 1.打上断点更方便理解 ~~~ ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.22/dist/vue.js"></script> </head> <body> <div id="app"> <button @click="dom">增加dom</button> <p v-for="i,index in list" ref="plist">{{i}}</p> <p ref="pHtml">我好</p> <!--<template id="ss">--> <!--template 渲染区域--> <!--</template>--> </div> <script> // 创建 Vue 实例,得到 ViewModel // vm.$mount('#app') 不常用,一般用el var vm = new Vue({ el: '#app', // template:'#ss', template 渲染 data: { list: ['as', 'bs', 'cs'], }, methods:{ dom(){ this.list.push('ds'); }, }, beforeCreate(){ debugger; }, created(){ debugger; }, beforeMount(){ debugger; }, mounted(){ debugger; }, beforeUpdate(){ debugger; }, updated(){ debugger; }, beforeDestroy(){ debugger; }, destroyed(){ debugger; } }); </script> </body> </html> ~~~ ![](https://box.kancloud.cn/475dba76050b004fd2283f26747f16d9_1140x1845.png) >[danger] ##### 主要的生命周期函数分类 ~~~ 创建期间的生命周期函数: + beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好 data 和 methods 属性 + created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板 + beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中 + mounted:此时,已经将编译好的模板,挂载到了页面指定的容器中显示 - 运行期间的生命周期函数: + beforeUpdate:状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点 + updated:实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了! - 销毁期间的生命周期函数: + beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。 + destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 ~~~ >[danger] ##### 另一种生命周期的说法 ~~~ beforeCreate(){ console.log("beforeCreate") }, created(){ console.log("created") //ajax 异步 }, beforeMount(){ console.log("beforeMount") //ajax 异步 }, mounted(){ console.log("mounted") // 监听事件 ,获取dom ,ajax // 开启定时器 }, beforeUpdate(){ console.log("beforeUpdate") }, updated(){ console.log("updated") // 更新后真实dom 可以访问了。 // 22222 }, beforeDestroy(){ console.log("beforeDestroy") }, destroyed(){ console.log("destroyed") //取消定时器, 解绑事件 } } ~~~ >[danger] ##### 面试问题 <a href='https://segmentfault.com/a/1190000013529404'>选自文章</a> ~~~ 1、什么是vue生命周期? 答: Vue 实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。 2、vue生命周期的作用是什么? 答:它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。 3、vue生命周期总共有几个阶段? 答:它可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后 4、第一次页面加载会触发哪几个钩子? 答:第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子 5、DOM 渲染在 哪个周期中就已经完成? 答:DOM 渲染在 mounted 中就已经完成了。 6、简单描述每个周期具体适合哪些场景? 答:生命周期钩子的一些使用方法: beforecreate : 可以在这加个loading事件,在加载实例时触发 created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用 mounted : 挂载元素,获取到DOM节点 updated : 如果对数据统一处理,在这里写上相应函数 beforeDestroy : 可以做一个确认停止事件的确认框 nextTick : 更新数据后立即操作dom ~~~