是的,每个Vue实例在被创建之前都要经过一系列的初始化过程。例如需要配置数据观测(data observe)、编译模版、挂载实例到DOM,然后在数据变化时更新到DOM。在这些过程中,实例就会调用一些生命周期钩子,这就给我们提供了执行自定义逻辑的机会。
所以什么是生命周期钩子???
beforeCreate、created、beforeMout、mouted、beforeUpdate、updated、beforeDestroy、destroyed这些都是钩子(相当于Vue实例在不同生命周期阶段可以回调的函数),在这些钩子里面可以自定义逻辑。当然这些钩子的this是指向调用它的Vue实例。
正如官网的流程图:
代码:
<section id="app">{{info}}</section>
<script>
var myVue=new Vue({
el:"#app",
data:{
info:"good"
},
beforeCreate:function(){
console.log("创建前========")
console.log(this.info) //undefined
console.log(this.$el) //undefined
},
created:function(){
console.log("已创建========")
console.log(this.info) //good
console.log(this.$el) //undefined
},
beforeMount:function(){
console.log("mount之前========")
console.log(this.info) //good
console.log(this.$el) //[object HTMLDivElement] 此时的$el是虚拟的DOM的节点,<section>标签里面的文本还没有被替换,还是<section id="app">{{info}}</section>
},
mounted:function(){
console.log("mounted========")
console.log(this.info) //good
console.log(this.$el) //[object HTMLDivElement] 此时的$el被替换了:<section id="app">good</section>
},
beforeUpdate:function(){
console.log("更新前========"); //执行 myVue.info="very good";触发更新
},
updated:function(){
console.log("更新完成========"); //更新完成 info的值为"very good"
},
beforeDestroy:function(){
console.log("销毁前========") //执行myVue.$destroy()触发销毁,实例销毁之前调用。在这一步,实例仍然完全可用。
console.log(this.info) //good
console.log(this.$el) //[object HTMLDivElement] <section id="app">good</section>
},
destroyed:function(){
console.log("已销毁========") //Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
console.log(this.info) //good
console.log(this.$el) //[object HTMLDivElement] <section id="app">good</sction>
}
})
</script>>