一、Vue生命周期函数
二、创建阶段
1.beforeCreate
生命周期函数中的第一个函数,这个函数他在执行Vue实现的,仅仅完成了自身事件的绑定和生命周期函数的初始工作,这时候实例里还没有el,data,methods这些相关属性
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
},
beforeCreate(){
console.log(this.msg);
}
</script>
可以看到控制台并未打印msg的内容。
2.created
生命周期函数中的第二个函数,这个函数在执行的时候,Vue实例已经初始化了data和methods中的属性
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
}
})
</script>
这时候可以看到控制台输出了msg的内容,说明Vue实例的属性已经初始化了,而且在此之前,msg还在处于未初始化的{{msg}}形式
三、挂载阶段
3.beforeMount
生命周期中的第三个函数,这个函数在执行Vue将el中指定范围作为模板翻译
开始挂载编译生成的HTML到对应位置时触发的钩子函数。但此时还未将编译出的HTML渲染到页面上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
</div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
},
beforeMount(){
console.log('beforeMount'+document.getElementById('h1').innerText);
}
})
</script>
控制台打印 结果如下
4.mounted
生命周期中的第四个函数,这个函数在执行过程中,已经将数据渲染到界面中,并且已经更新页面。将编译好的HTML挂载到页面完成后执行的钩子函数,此时可以发送ajax请求获取数据的操作进行数据初始化。但mounted在整个实例声明内只执行一次
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
</div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
},
beforeMount(){
console.log('beforeMount'+document.getElementById('h1').innerText);
},
mounted(){
console.log('mounted'+document.getElementById('h1').innerText);
}
})
</script>
控制台打印
四、运行阶段
5.beforeUpdate
生命周期中的第五个函数,这个函数是data中的数据发生变化时候进行的,这个事件执行仅仅是Vue实例中data数据变化页面显示的仍然是原始数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
<input type="text" v-model="msg">
</div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
},
beforeMount(){
console.log('beforeMount'+document.getElementById('h1').innerText);
},
mounted(){
console.log('mounted'+document.getElementById('h1').innerText);
},
//运行阶段
beforeUpdate(){
console.log("beforeUpdate" + this.msg);
console.log("beforeUpdate" + document.getElementById('h1').innerText);
}
})
</script>
可以看到,当改变数据的时候,函数中得到的标签中的数据仍然是未更新过的原始数据
6.updated
生命周期中第六个函数,这个函数是data中数据发生变化时候执行,页面中的数据已经和data中的数据保持一致,是更新过的新数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
<input type="text" v-model="msg">
</div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
},
beforeMount(){
console.log('beforeMount'+document.getElementById('h1').innerText);
},
mounted(){
console.log('mounted'+document.getElementById('h1').innerText);
},
//运行阶段
beforeUpdate(){
console.log("beforeUpdate" + this.msg);
console.log("beforeUpdate" + document.getElementById('h1').innerText);
},
updated(){
console.log('updated' + this.msg);
console.log('updated' + document.getElementById('h1').innerText)
}
})
</script>
效果如下
五、销毁阶段
7.beforeDestory
生命周期钩子函数中的第七个函数。当执行beforeDestory钩子函数时,Vue实例就已经从运行阶段进入销毁阶段,此时,组建中所有data、methods以及过滤器,指令等都处于可用状态,此时还未真正执行销毁过程
8.destroyed
生命周期函数中的第八个函数,该函数执行的时候,Vue实例彻底被销毁
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
<input type="text" v-model="msg">
</div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script>
const vm = new Vue({
el:'#app',
data:{
msg:'恕瑞玛'
},
methods:{
show(){
alert('弹窗来啦');
},
display(){
console.log('哈哈啊哈');
}
},
beforeCreate(){
console.log(this.msg);
},
created(){
console.log(this.msg);
this.show();
},
beforeMount(){
console.log('beforeMount'+document.getElementById('h1').innerText);
},
mounted(){
console.log('mounted'+document.getElementById('h1').innerText);
},
//运行阶段
beforeUpdate(){
console.log("beforeUpdate" + this.msg);
console.log("beforeUpdate" + document.getElementById('h1').innerText);
},
updated(){
console.log('updated' + this.msg);
console.log('updated' + document.getElementById('h1').innerText)
},
beforeDestroy(){
console.log('执行了销毁前beforeDestroy');
this.display();
},
destroyed(){
console.log('执行了销毁后destroyed');
this.display();
}
})
</script>
控制台输出如下,当我们执行完vm.$destroy()销毁函数后,beforeDestory 和 destroyed 都被执行,然后再输入框里输入内容,<h1>{{msg}}<h1> 不再会同步展示,因为Vue实例已经被彻底销毁了。