vue生命周期
Vue实例从开始创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染、写在等一系列过程,我们称这是Vue的生命周期,各个阶段有相对应的事件钩子
1.生命周期钩子函数
下面这张图是vue生命周期各个阶段的执行情况
生命周期钩子 | 组件状态 | 最佳实践 |
---|---|---|
beforCreate | 实例初始化之后,this指向创建的实例,不能访问到data、computed、watch、methods上的方法和数据 | 常用于初始化非响应式变量 |
created | 实例创建完成,可访问data、computed、watch、methods上的方法和数据,未挂载DOM,不能访问$el属性,$el属性内容为空数组 | 常用于简单的ajax请求,页面的初始化 |
beforeMount | 在挂载开始之前被调用,beforeMount之前,回找到对应的template,并编译成render函数 | |
mounted | 实例挂载到DOM上,此时可以通过DOM API获取到DOM节点,$ref属性可以访问 | 常用于获取VNode信息和操作,ajax请求 |
beforeUpdate | 响应式数据更新时调用,发生在虚拟DOM打补丁之前 | 适合更新之前访问现有的DOM,比如手动移除已添加的事件监听 |
update | 虚拟DOM重新渲染和打补丁之后调用,组件DOM已经更新,可执行依赖于DOM的操作 | 避免在这个钩子中操作数据,否则可能陷入死循环 |
beforeDestroy | 实例销毁之前调用。这一步,实例仍然完全可用,this仍能获取到实例 | 常用于销毁定时器、解绑全局事件、销毁插件对象等操作 |
destroyed | 实例销毁后调用,调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁 |
注意:
- created阶段的ajax请求与mounted请求的区别:前者页面视图未出现,如果请求信息过多,页面会长时间处于白屏状态
- mounted不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以使用
vm.$nextTick
- vue2.0之后主动调用
$destroy()
不会一处dom节点,不推荐直接destroy
这种做法,如果实在需要这样用,可以在这个生命周期钩子中手动移除dom节点 - beforeupdate和updated:响应式属性必须在template模板中使用,他们才会执行
2.单个组件的生命周期
<template>
<div>
{{name}}
<button @click="destroy">销毁</button>
<button @click="change">更改name</button>
</div>
</template>
<script>
export default {
data(){
return {
name:'我是组件'
}
},
beforeCreate(){
this.comName = 'M'
console.log(this.comName,'---beforeCreate');
},
created(){
console.log(this.name,'---created')
},
beforeMount(){
console.log(this.comName,'---beforeMount')
},
mounted(){
console.log(this.name,'---mounted')
},
beforeUpdate(){
console.log(this.name,'---beforeUpdate')
},
updated(){
console.log(this.name,'---updated')
},
beforeDestroy(){
console.log(this.name,'---beforeDestroy')
},
destroyed(){
console.log(this.name,'---destroyed')
},
methods:{
destroy(){
this.$destroy()
},
change(){
this.name = '哈哈'
}
}
}
初始化
// M ---beforeCreate
// 我是组件 ---created
// M ---beforeMount
// 我是组件 ---mounted
点击更改name按钮
// 哈哈 ---beforeUpdate
// 哈哈 ---updated
点击销毁按钮
// 哈哈 ---beforeDestroy
// 哈哈 ---destroyed
从打印结果可以看出
- 初始化组件时,仅执行了beforeCreate/created/beforeMount/mounted这四个钩子函数
- 当改变data中定义的变量(响应式变量)时,会执行beforeUpdate/updated钩子函数
- 当销毁组件时,会执行beforeDestory/destoryed钩子函数
- 初始化和销毁时的生命周期钩子函数均只会执行一次,beforeUpdate/update可执行多次