Vue 的生命周期 (最全周期)

最全生命周期 (一定看到最后)

Vue 实例有一个完整的生命周期,也就是从开始创建初始化数据编译模板挂载 Dom渲染更新渲染销毁等一系列过程,我们称这是 Vue 的生命周期。通俗说就是 Vue 实例从创建到销毁的过程,就是生命周期。

1.实例、组件通过 new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate 钩子函数,这个时候,数据还没有挂载呢,只是一个空壳无法访问到数据和真实的 dom,一般不做操作

2. 挂载数据绑定事件等等,然后执行 created 函数,这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发 updated 函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

3. 接下来开始找实例或者组件对应的模板,编译模板为虚拟 dom 放入到 render 函数中准备渲染,然后执行 beforeMount 钩子函数,在这个函数中虚拟 dom 已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发 updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

4. 接下来开始 render,渲染出真实 dom,然后执行 mounted 钩子函数,此时,组件已经出现在页面中,数据、真实 dom 都已经处理好了,事件都已经挂载好了,可以在这里操作真实 dom 等事情…

5.组件或实例的数据更改之后会立即执行 beforeUpdate,然后 vue 的虚拟 dom机制会重新构建虚拟 dom 与上一次的虚拟 dom 树利用 diff 算法进行对比之后重新渲染,一般不做什么事儿

6. 当更新完成后,执行 updated,数据已经更改完成,dom 也重新 render 完成,可以操作更新后的虚拟 dom

7.. 当经过某种途径调用$destroy 方法后,立即执行 beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等

8.组件的数据绑定、监听…去掉后只剩下 dom 空壳,这个时候,执行 destroyed,在这里做善后工作也可以

在这里插入图片描述
在这里插入图片描述
01 建立前后

<div id="root"></div>
<script type="text/javascript">
var vm=new Vue({
el:"#root",
beforeCreate:function(){//01 建立之前
console.log("before create");
},
created:function(){
console.log("created");//02 建立之后
}
})
</script>

02-1 有模板的渲染情况(按模板渲染)

<div id="root"></div>
<script type="text/javascript">
var vm=new Vue({
el:"#root",
data:{},
beforeCreate:function(){
console.log("before create");
},
created:function(){
console.log("created");
},
template:'<h1>123</h1>',//如果有模板的话模板替换 EL
})
</script>

02-1 无模板的渲染情况(按挂载元素渲染)

<div id="root">{{message}}</div>
<script type="text/javascript">
var vm=new Vue({
el:"#root",
data:{
message:"hello vue!"
},
beforeCreate:function(){
console.log("before create");
},
created:function(){
console.log("created");
},
//如果无模板则用默认的 el 作为挂载点的模板
/*template:'<h1>123</h1>',*/ 
})

03 挂载前后

<div id="root"></div>
<script type="text/javascript">
//备注:没有模板无论是挂载前还是挂载后均显示原有 el 的结构
var vm=new Vue({
el:"#root",
data:{},
beforeCreate:function(){
console.log("before create");
},
created:function(){
console.log("created");
},
beforeMount:function(){//挂载之前
console.log(this.$el);
console.log("before mount")
},
mounted:function(){
console.log(this.$el);
console.log("mounted")
}
})
</script>

04 销毁前后

<div id="root">{{message}}</div>
<script type="text/javascript">
//备注:有模板情情况显示的是模板
var vm=new Vue({
el:"#root",
data:{
message:"未挂载模板之前的显示"
},
template:"<h1>This is h1 template</h1>",
beforeCreate:function(){
console.log("before create");
},
created:function(){
console.log("created");
},
beforeMount:function(){//挂载之前
console.log(this.$el);
console.log("before mount")
},
mounted:function(){
console.log(this.$el);
console.log("mounted")
},
//以下两个在控制台并不能被打印出来,执行完 vm.$destroy()即可以打印
beforeDestroy:function(){
console.log("before destroy");
},
destroyed:function(){
console.log("destoryed");
}
})
</script>

05 更新前后

<div id="root">{{message}}</div>
<script type="text/javascript">
//备注:有模板情情况显示的是模板
var vm=new Vue({
el:"#root",
data:{
message:"This is a message"
},
//template:"<h1>This is h1 template</h1>",
beforeCreate:function(){
console.log("before create");
},
created:function(){
console.log("created");
},
beforeMount:function(){//挂载之前
console.log(this.$el);
console.log("before mount")
},
mounted:function(){
console.log(this.$el);
console.log("mounted")
},
//以下两个在控制台并不能被打印出来,执行完 vm.$destroy()即可以打印
beforeDestroy:function(){
console.log("before destroy");
},
destroyed:function(){
console.log("destoryed");
},

//beforeUpdate 与 updated 并不能打印输出,只有在控制台输入 vm.$data.message="新值后"才可以看到结

//更新前

beforeUpdate:function(){
console.log("beforeUpdate");
},

//更新后

updated:function(){
console.log("updated")
}
})

在这里插入图片描述

  • 19
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值