Vue的生命周期
每一个Vue应用都是通过Vue函数创建一个新的Vue实例开始的
每一个Vue实例在被创建时都要经过一系列的初始化过程——如:设置数据监听、编译模版、将Vue实例挂载到DOM(html标签元素)上,并且数据发生变化DOM也会随之更新,等等操作。同时在这个过程中也会运行一些叫做生命周期钩子的函数,有了这些函数,我们就能在不同阶段、不同的时间点执行一些我们想要的操作
官网图片,自己翻译的。。
- beforeCreate
- 实例初始化后,被调用的方法
- 数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
- created
- 实例创建完成后立即被调用的方法
- 在这一步,实例已完成以下的配置:数据观测 (data observer),property 和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,
$el
property 目前尚不可用。
- beforeMount
- 挂载开始之前被调用的方法
- 相关的
render
函数首次被调用。
- mounted
- 挂载完成之后被调用的方法
- 这时
el
被新创建的vm.$el
替换了。如果根实例挂载到了一个文档内的元素上,当mounted
被调用时vm.$el
也在文档内。
- beforeUpdate
- 数据更新时被调用的方法
- 发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
- updated
- 数据更新完毕后被调用的方法
- 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
- beforeDestroy
- 实例销毁之前被执行的方法
- 此时实例还是可以使用的,可以进行一些销毁前的工作
- destroyed
- 实例被销毁之后被执行的方法
- 对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。
补充两个不常用的:
- activated
- 被 keep-alive 缓存的组件激活时调用的方法
- deactivated
- 被 keep-alive 缓存的组件停用时调用的方法
2.5.0新增:
- errorCaptured
- 当捕获一个来自子孙组件的错误时被调用的方法
示例:
主要来看$el
、$data
、message
的变化过程
<div id="app">{{message}}</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:'haha'
},
methods:{
infoLog:function (){
console.log(" "+this.$el)
console.log(" "+this.$data)
console.log(" "+this.message)
}
},
beforeCreate:function (){
console.log("----------------实例创建之前----------------");
console.log(" "+this.$el)
console.log(" "+this.$data)
console.log(" "+this.message)
},
created:function (){
console.log("----------------实例创建之后----------------");
this.infoLog();
},
beforeMount:function (){
console.log("----------------组件挂载之前----------------");
this.infoLog();
},
mounted:function (){
console.log("----------------组件挂载完成----------------");
this.infoLog();
},
beforeUpdate:function (){
console.log("----------------组件修改之前----------------");
this.infoLog();
},
updated:function (){
console.log("----------------组件修改完成----------------");
this.infoLog();
},
beforeDestroy:function (){
console.log("----------------实例销毁之前----------------");
this.infoLog();
},
destroyed:function (){
console.log("----------------实例销毁完成----------------");
this.infoLog();
}
})
app.$data.message='vue!';//修改数据,触发beforeUpdate、updated函数
// app.$destroy();
</script>
控制台下查看:
调用app.$destroy();方法