【Vue】详解Vue生命周期

news/2024/10/29 3:25:46/

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()会直接销毁实例


http://www.ppmy.cn/news/222837.html

相关文章

图书购物商城 图书后台管理系统

图书购物商城 图书后台管理系统 这个图书购物商城系统是一个基于JSP、Servlet和MySQL技术开发的综合性系统&#xff0c;它包括前台和后台功能。该系统旨在为用户提供一个便捷的购书平台&#xff0c;同时为管理员提供管理图书和订单的功能。 前台部分是用户使用的界面&#xf…

过去、现在及未来

人生最邪恶的地方在于&#xff0c;只能年轻一次 回顾下我毫无规划的&#xff0c;且已经消耗掉的青春 一&#xff1a;过去 19岁&#xff0c;进入大学&#xff0c;兼职、玩儿、暧昧 20-21岁&#xff0c;初创软件公司打杂、恋爱、暧昧 22、23、24岁&#xff0c;上海&#xff…

SQL-基础

SQL-小基础 1 SQL简介 英文&#xff1a;Structured Query Language&#xff0c;简称 SQL结构化查询语言&#xff0c;一门操作关系型数据库的编程语言定义操作所有关系型数据库的统一标准对于同一个需求&#xff0c;每一种数据库操作的方式可能会存在一些不一样的地方&#xff…

06.05

1.二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法&#xff1a;先将 aaa 和 bbb 转化成十进制数&#xff0c;求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算&#xff0c;我们可以很简单地写出这…

NIMA: Neural Image Assessment

摘要:基于自动学习的图像质量评估技术在评价图像采集管道、存储技术和共享媒体等方面具有广泛的应用价值&#xff0c;近年来已成为图像质量评估研究的热点。尽管这一问题具有主观性&#xff0c;但现有的大多数方法仅对AVA[1]和TID2013[2]等数据集提供的平均意见得分进行预测。我…

哪些蓝牙耳机便宜好用?实惠好用的蓝牙耳机推荐

现在无线蓝牙耳机可以轻松实现移动中通话和听音乐&#xff0c;享受充分的无线自由&#xff0c;多数人购买蓝牙耳机对于音质有要求以及好用以外&#xff0c;当然还有性价比&#xff0c;下面我来推荐几款实惠好用的蓝牙耳机。 一、南卡lite pro2蓝牙耳机 NANK南卡是我国的国产品…

低噪放大器

0 引言 在雷达射频接收系统中&#xff0c;对系统性能指标的要求越来越高&#xff0c;其中低噪声放大器是影响着整个接收系统的噪声指标的重要因素。与普通的放大器相比&#xff0c;低噪声放大器作用比较突出&#xff0c;一方面可以减少系统的杂波干扰&#xff0c;提高系统的灵敏…

用NE5532运算放大器制作降噪耳机

文章目录 前言一、运放选用二、使用步骤 前言 这是一款用运放设计的降噪耳机&#xff0c;所谓“降噪耳机”就是使用者戴上它之后在比较吵闹的环境中感到相对安静。   下面笔者介绍它的工作原理。我们知道声音是一种机械波。它是靠机械振动产生的。我们感知声音是声波推动耳朵…