首先,需要了解Vue的生命周期是什么。Vue生命周期是Vue实例从创建到销毁的过程,在其中它会依次经过不同的状态和调用不同的钩子函数。Vue的生命周期分为8个阶段,分别是:
beforeCreate
: 在实例初始化之后,数据观测和初始化事件之前调用。created
: 在实例创建完成后调用,此阶段完成了数据观测和属性计算,但尚未开始真正的DOM相关操作。beforeMount
: 在挂载之前被调用,即在DOM元素替换之前,可以在此阶段更改实例的$el属性。mounted
: 在挂载完成后调用,此时实例的DOM已经被渲染出来,可以访问到实例的DOM元素。beforeUpdate
: 在组件更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。updated
: 组件更新完毕后调用,此时组件DOM已经完成更新。beforeDestroy
: 在实例销毁之前调用,此时实例的子组件和DOM都未被销毁。destroyed
: 在实例销毁之后调用,此时实例的子组件和DOM都已经被销毁。
接下来分别解释这些生命周期,并且给出相关的示例说明。
beforeCreate
在beforeCreate
阶段,实例已经完成了属性和方法的初始化,但是还未进入DOM相关操作,这时可以进行一些接下来会用到的配置或者初始化操作。例如下面这个示例,可以在beforeCreate
阶段进行全局组件或者插件的注册:
Vue.mixin({
created() {
console.log('全局混入beforeCreate钩子被调用')
}
})
new Vue({
beforeCreate() {
console.log('实例beforeCreate钩子被调用')
},
el: '#app',
data() {
return {
message: 'hello world!'
}
}
})
created
在created
阶段,实例已经完成了对属性数据的监听,组件与父组件之间的事件监听和响应,这个时候可以进行比较复杂的计算和数据操作。例如下面这个示例,可以在初始化后对属性进行一些计算:
new Vue({
created() {
this.reversedMessage = this.message.split('').reverse().join('')
},
el: '#app',
data() {
return {
message: 'hello world!',
reversedMessage: ''
}
}
})
beforeMount
在beforeMount
阶段,实例已经完成了属性和方法的初始化,也已经得到了Virtual DOM,这个时候页面并没有真正的渲染出来。可以在这个阶段进行一些dom相关初始化操作。例如下面这个示例,可以修改el
属性来指定实例挂载的位置:
new Vue({
beforeMount() {
this.$options.el = '#app';
},
data() {
return {
message: 'hello world!'
}
}
})
mounted
在mounted
阶段,对应的DOM元素已经全部渲染完成,并且实例的数据和DOM已经被挂载到了一起,此时可以进行一些操作,例如访问DOM元素或者发起异步请求。例如下面这个示例,可以在页面上完成mounted事件的绑定和解除:
new Vue({
mounted() {
document.addEventListener('click', this.onClick)
},
beforeDestroy() {
document.removeEventListener('click', this.onClick)
},
methods: {
onClick() {
console.log('click')
}
}
})
beforeUpdate
在beforeUpdate
阶段,实例已经重新渲染了Virtual DOM,但是还没有开始打补丁,可以在这个阶段进行一些修改数据的操作。例如下面这个示例,可以在修改数据后进行一个比较耗时的操作:
new Vue({
beforeUpdate() {
this.$nextTick(() => {
console.log('值被更新:' + this.message)
})
},
data() {
return {
message: 'hello world!'
}
}
})
updated
在updated
阶段,实例已经完成了对比Virtual DOM的操作,把需要更新的地方进行了真正的DOM更新,可以进行一些后期的DOM操作,例如获取更新后的DOM信息或者发起异步请求。例如下面这个示例,可以在页面更新完成后修改input元素的值:
new Vue({
updated() {
this.$refs.input.value = this.message
},
data() {
return {
message: 'hello world!'
}
}
})
beforeDestroy
在beforeDestroy
阶段,可以进行实例销毁前必要的清理工作,比如关闭定时器或者移除DOM元素。例如下面这个示例中,在销毁前移除了绑定的事件监听:
new Vue({
mounted() {
document.addEventListener('click', this.onClick)
},
beforeDestroy() {
document.removeEventListener('click', this.onClick)
},
methods: {
onClick() {
console.log('click')
}
}
})
destroyed
在destroyed
阶段,实例已经被销毁,可以释放所有跟实例有关的的资源,这个时候就可以进行一些自定义的清理操作。例如下面这个示例,在销毁前打印一行消息:
new Vue({
destroyed() {
console.log('Vue实例已经销毁')
},
data() {
return {
message: 'hello world!'
}
}
})
以上便是针对Vue生命周期的详细讲解,其中包括了各个阶段的作用和需要注意的地方,并附带了一些相关的示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue生命周期区别详解 - Python技术站