Vue实例的生命周期全过程(图)

(这里的红边圆角矩形内的都是对应的Vue实例的钩子函数)

在beforeCreate和created钩子函数间的生命周期

在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这个时候开始监控data中的数据变化了,同时初始化事件
 
 

created钩子函数和beforeMount间的生命周期

对于created钩子函数和beforeMount间可能会让人感到有些迷惑,下面我就来解释一下:

el选项的有无对生命周期过程的影响

首先系统会判断对象中有没有el选项
有el选项,则继续编译过程
没有el选项,则停止编译,也意味着暂时停止了生命周期,直到vm.$mount(el)
下面我展示一下:
new Vue({
el: '#app',
beforeCreate: function () {
console.log('调用了beforeCreat钩子函数')
},
created: function () {
console.log('调用了created钩子函数')
},
beforeMount: function () {
console.log('调用了beforeMount钩子函数')
},
mounted: function () {
console.log('调用了mounted钩子函数')
}
})
demo如下:
可以看到,在el选项填写且正确的时候,生命周期将正常进行
 
而当我们把el去掉:
new Vue({
beforeCreate: function () {
console.log('调用了beforeCreat钩子函数')
},
created: function () {
console.log('调用了created钩子函数')
},
beforeMount: function () {
console.log('调用了beforeMount钩子函数')
},
mounted: function () {
console.log('调用了mounted钩子函数')
}
})
demo:
 
可以看到,生命周期的钩子函数执行到created就结束了
而当我们不加el选项,但是手动执行vm.$mount(el)方法的话,也能够使暂停的生命周期进行下去,例如:
var vm = new Vue({
beforeCreate: function () {
console.log('调用了beforeCreat钩子函数')
},
created: function () {
console.log('调用了created钩子函数')
},
beforeMount: function () {
console.log('调用了beforeMount钩子函数')
},
mounted: function () {
console.log('调用了mounted钩子函数')
}
})
vm.$mount('#app')
demo如下,可以看到,这个时候虽然对象中没有el参数,但通过$mount(el)动态添加的方式,也能够使生命周期顺利进行
 

template参数选项的有无对生命周期的影响

 
1.如果Vue实例对象中有template参数选项,则将其作为模板编译成render函数
2.如果没有template参数选项,则将外部的HTML作为模板编译(template),也就是说,template参数选项的优先级要比外部的HTML高
3.如果1,2条件都不具备,则报错
我们可以把模板写在template参数选项中:
new Vue({
el: '#app',
template: '<div ><p>模板在templated参数中找到了哟~</p></div>'
})
demo:
也可以把参数选项写在外部HTML中,像这样:
外部HTML:
<div ><p>模板是在外部HTML中找到的~</p></div>
创建对象实例:
new Vue({
el: '#app'
})
demo:
那么有趣的问题来了,当模板同时放在template参数选项和外部HTML中,会怎样呢?
例如:
外部HTML:
<div ><p>模板是在外部HTML中找到的~</p></div>
 
创建Vue实例(包含template参数选项)
new Vue({
el: '#app',
template: '<div ><p>模板在templated参数中找到了哟~</p></div>'
})
demo如下:
很显然,正如我上面下的结论一样,最终显示的是“模板在templated参数中找到了哟~”而不是“模板是在外部HTML中找到的~”,因为template参数的优先级比外部HTML的优先级要高
 
【注意】
1.为什么判断el要发生在判断template前面呢
 
因为Vue需要通过el的“选择器”找到对应的template。总结一下上述的过程,Vue通过el参数去找到对应的template。然后,根据el参数给出的“选择器”,首先去Vue实例对象本身的template选项参数中找,如果没有template参数,则到外部HTML中寻找,找到后将模板编译成render函数
 
2.实际上,在Vue中,有render函数这个选项,它以createElement作为参数,做渲染操作。当然你也可以不调用createElement,而直接嵌入JSX(学习react的同学对此应该很熟悉吧)。
new Vue({
el: '#demo',
render (createElement) {
return (....)
}
})
【注意】render选项参数比template更接近Vue解析器!所以综合排列如下:
render函数选项  > template参数  > 外部HTML
 

Vue的编译过程——把模板编译成 render 函数

Vue的编译实际上是指Vue把模板编译成 render 函数的过程
 
我们可以通过Vue.compile这个实时编译模板的函数来看一看:
用官方文档的例子做个解释:
<div>
<header>
<h1>I'm a template!</h1>
</header>
<p v-if="message">
{{ message }}
</p>
<p v-else>
No message.
</p>
</div>
会被渲染成
function anonymous() {
with(this){return _c('div',[_m(0),(message)?_c('p',[_v(_s(message))]):_c('p',[_v("No message.")])])}
}

beforeMount和mounted钩子函数间的生命周期


对于这一点,我也感到有些迷惑,百度后之后也没什么头绪,最后我思考的结果是这样的:正因为render函数和template选项的“优先级”比外部HTML要高,所以,最后一般会存在一个外部HTML模板被Vue实例本身配置的模板所“替代”的过程也就是上图所说的 “replace”
 
(如果大家有不同意见也可以在评论处一起讨论)
 

beforeUpdate钩子函数和updated钩子函数间的生命周期

 
在Vue中,数据更改会导致虚拟 DOM 重新渲染,并先后调用beforeUpdate钩子函数和updated钩子函数
 
但要注意一点:重渲染(调用这两个钩子函数)的前提是被更改的数据已经被写入模板中!!(这点很重要)
例如:
var vm = new Vue({
el: '#app',
data: {
number: 1
},
template: '<div ><p></p></div>',
beforeUpdate: function () {
console.log('调用了beforeUpdate钩子函数')
},
updated: function () {
console.log('调用了updated钩子函数')
}
})
vm.number = 2
 
控制台上并没有如我们预料那样输出调用两个钩子函数的文本
而当我们改成
var vm = new Vue({
el: '#app',
data: {
number: 1
},
// 在模板中使用number这个数据
template: '<div ><p>  {{ number }} </p></div>',
beforeUpdate: function () {
console.log('调用了beforeUpdate钩子函数')
},
updated: function () {
console.log('调用了updated钩子函数')
}
})
vm.number = 2
这个时候,调用两个钩子函数的文本就被输出来了
总之,只有Vue实例中的数据被“写入”到我们的模板中,它的改变才可以被Vue追踪,重渲染从而调用 beforeUpdate钩子函数和updated钩子函数
 

beforeDestroy和destroyed钩子函数间的生命周期

beforeDestroy钩子函数在实例销毁之前调用。在这一步,实例仍然完全可用。
 
destroyed钩子函数在Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
 
【注意】就如同调用在Vue实例上调用$mounted会使暂停的生命周期继续一样,调用$destroy()会直接销毁实例
 

【Vue】详解Vue生命周期相关推荐

  1. Vue实例详解与生命周期

    Vue实例详解与生命周期 http://www.jianshu.com/p/b5858f1e6e76 Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理. ...

  2. 详解servlet生命周期

    详解servlet 生命周期(转载) Servlet 有良好的生存期的定义,包括如何加载.实例化.初始化.处理客户端请求以及如何被移除.这个生存期由 javax.Servlet.Servlet 接口的 ...

  3. 详解spring生命周期的扩展点

    详解spring生命周期的扩展点,加速你追赶高手的脚步 详解spring生命周期的扩展点

  4. vue 监控元素宽度_Vue入门系列之Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  5. 05Vue.js快速入门-Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  6. 微信小程序02【配置详解、生命周期-app对象使用、页面跳转详解】

    学习地址:https://www.bilibili.com/video/BV1sx411z77P 笔记01:https://blog.csdn.net/weixin_44949135/article/ ...

  7. 详解react生命周期

    生命周期函数是指在某一特定时刻组件会自动调用执行的函数. react生命周期可分为3个阶段:挂载,更新及销毁. 在挂载前会先进行初始化过程,这个阶段组件会初始化自己的数据,如state.props. ...

  8. maven详解之生命周期与插件

    Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...

  9. 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...

    什么是 LTV? LTV的全称是Life Time Value,用来衡量用户的生命周期价值. LTV是通常被应用于营销领域,用来衡量用户在其生命周期内,为企业贡献了多少收入或利润(根据算法微调可分别计 ...

  10. k8s 详解 pod 生命周期 容器探测(live and ready) 钩子函数 pod的重启策略

    pause 容器, 每个pod的都有的根容器,评估pod 的健康状态,设置ip地址,ip+端口可以访问到指定的容器 pod pod 之间采用 flannel 通信 pod 定义 yaml 资源清单 一 ...

最新文章

  1. 无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...
  2. 参观中央财经大学机房安装centos6.4及优化小结
  3. 使用CL_RS_WHERE创建dynamic SQL statement
  4. python学习-10 运算符1
  5. 如何在程序中打开PDF文件 -C#文章(.net)
  6. github git.exe位置
  7. PyTorch实战福利从入门到精通之五——搭建ResNet
  8. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
  9. 计算机windows实验原理,Windows上机实验报告
  10. 双线性变换(Tustin transform/bilinear transformation)
  11. 第21课: JSP语句 if判断语句 (JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  12. 聚合支付SAAS系统OEM贴牌定制开发聚合支付系统开发、聚合支付平台开发等。
  13. New:Spire.Office for Java 7.7.1 Not Crack
  14. Elasticsearch(ES)创建索引
  15. weight_decay一般设置为多少_建盏一般多少钱?建阳建盏定价的依据是什么?宋韵建盏为你解析...
  16. 实战NLP beginner任务一:基于机器学习的文本分类
  17. python在地图上标注点_只要两步,用Python将地址标记在地图上!
  18. 您选择的分区不支持无损调整容量操作
  19. 清华大学出版社计算机绘谱,清华大学出版社-图书详情-《土木与建筑类CAD技能一级(二维计算机绘图)AutoCAD培训教程》...
  20. 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题

热门文章

  1. Facebook路由事故未圆,何以元宇宙?
  2. STF开源框架之minicap工具
  3. 你会给父母买保险吗?
  4. OC与Swift混编 注意事项
  5. 我的职业生涯(八) 自我疗伤
  6. react如何使用百度地图
  7. 华为ac、瘦ap简单上线(旁挂式)
  8. 云时代下,传统和新型存储的博弈已经开始
  9. 流畅的Python阅读笔记(二)
  10. STM32的SWD调试方式