目录

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

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

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

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

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

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

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

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

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


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 id="app"><p>模板在templated参数中找到了哟~</p></div>'
})
demo:

也可以把参数选项写在外部HTML中,像这样:

外部HTML:

<div id="app"><p>模板是在外部HTML中找到的~</p></div>
创建对象实例:
new Vue({el: '#app'
})

demo:

那么有趣的问题来了,当模板同时放在template参数选项和外部HTML中,会怎样呢?

例如:

外部HTML:

<div id="app"><p>模板是在外部HTML中找到的~</p></div>

创建Vue实例(包含template参数选项)

new Vue({el: '#app',template: '<div id="app"><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 id="app"><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 id="app"><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的生命周期(建议收藏)相关推荐

  1. “约见”面试官系列之常见面试题第二十篇之vuex得理解(建议收藏)

    一.概念 vuex是一个专为vue.js应用程序开发的状态管理模式(它采用集中式存贮管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化). 二.五大核心属性 核心属性为:sta ...

  2. “约见”面试官系列之常见面试题第十三篇之css动画效果(建议收藏)

    目录 CSS动画简介 第一部分:CSS Transition 1.1 基本用法 1.2 transition-delay 1.3 transition-timing-function 1.4 tran ...

  3. “约见”面试官系列之常见面试题第五篇说说vuex登录信息(建议收藏)

    此篇文章是介绍利用 vuex 储存用户登录时的相关信息的使用方法. 声明:前面部分是刚开始对vuex的接触,后面部分是学习后对vuex使用的部分优化,想直接用最新的,可以直接找到 20200819 部 ...

  4. “约见”面试官系列之常见面试题第二十七篇之vue-router的重要属性

    export default new Router({mode: 'history', //路由模式,取值为history与hashbase: '/', //打包路径,默认为/,可以修改routes: ...

  5. “约见”面试官系列之常见面试题第二十三篇之get和post区别(建议收藏)

    POST和GET是HTTP协议中最常用的两种传参方式,这里小小总结一下两者的区别,欢迎补充~! 请求方式 GET POST 参数位置 url的query中 一般在content中,query也可 参数 ...

  6. “约见”面试官系列之常见面试题第二十一篇之函数防抖和节流(建议收藏)

    目录 前言 概念 函数防抖(debounce) 函数节流(throttle) 常见应用场景 函数防抖的应用场景 函数节流的应用场景 实现原理 函数防抖(debounce) 函数节流(throttle) ...

  7. “约见”面试官系列之常见面试题第十七篇之实现深拷贝(建议收藏)

    建议最简单的第一种 1.通过 JSON 对象实现深拷贝 this.data = JSON.parse(JSON.stringify(this.vm.$store.state.security.menu ...

  8. “约见”面试官系列之常见面试题第十一篇之canvas(建议收藏)

    目录 前言 介绍 小试牛刀 应用案例 动画 API介绍 Demo 游戏 三要素 Demo 截图 API介绍 canvas.style.width 和 canvas.width 的区别 Demo 合成图 ...

  9. “约见”面试官系列之常见面试题第十篇值meta标签(建议收藏)

    目录 什么是meta标签? meta的作用 meta的必需属性和可选属性 必需属性content 可选属性 常用meta标签大总结 charset 百度禁止转码 SEO 优化部分 viewport 各 ...

最新文章

  1. 二、制作最小linux系统
  2. 1.3.2 中断和异常(内中断和外中断、中断处理过程)
  3. swift源代码兼容开源项目清单
  4. 修改linux文件夹密码忘记,Linux中如何重新获取丢失的密码
  5. leetcode96. 不同的二叉搜索树
  6. vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!
  7. 麦克风失灵_iPhone7Plus手机麦克风失灵怎么办?请看解决方案
  8. python创建虚拟环境打包_用虚拟环境保存库文件--Python打包-阿里云开发者社区
  9. 【bzoj1668/Usaco2006 Oct】Cow Pie Treasures 馅饼里的财富——dp
  10. Codeforces Round 258(Div. 2)
  11. 手把手实现Java图书管理系统(附源码)
  12. AD转换实验c语言原理图,我的AD/DA转换单片机实验,含原理图和源码
  13. mysql题 以下1-7_mysql练习题
  14. 笔耕不辍 elementUI el-tree实现懒加载和直接查询实现
  15. Node.js 网页瘸腿稍强点爬虫再体验
  16. linux ipsec racoon工具移动客户端模式详细配置
  17. 微信支付 postman_微信上线新功能,马化腾都在玩!快查查你多少分?
  18. C#装箱(Boxing)和拆箱(Unboxing)
  19. STC51从入门到精通(汇编)~~~ 第三讲:MCS-51单片机的结构和工作原理
  20. codeforces gym 100827A Runes

热门文章

  1. Activity、Fragment、Dialog基类简单整理
  2. Android - Okhttp拦截器
  3. 【转】java中定义二维数组的几种写法
  4. 执行shell出现bad interpreter
  5. 夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计
  6. 第十三章 Perl的面向对象编程
  7. minio 授予永久访问权限_应对 iOS 14 权限管理 应用手把手教你打开“所有照片”权限...
  8. java web junit_如何使用junit测试javaweb工程
  9. php splqueue 5.5安装,解析PHP标准库SPL数据结构
  10. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct