钩子函数
Vue里提供了8种钩子函数,在不同的生命周期中进行不同的方法。
Vue生命周期
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue生命周期学习</title>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
<div id="app">
<h1>{{message}}</h1>
</div>
</body>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Vue的生命周期'
},
beforeCreate: function() {
console.group('------beforeCreate创建前状态------');
console.log("%c%s", "color:red" , "el : " + this.$el); //undefined
console.log("%c%s", "color:red","data : " + this.$data); //undefined
console.log("%c%s", "color:red","message: " + this.message)
},
created: function() {
console.group('------created创建完毕状态------');
console.log("%c%s", "color:red","el : " + this.$el); //undefined
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
beforeMount: function() {
console.group('------beforeMount挂载前状态------');
console.log("%c%s", "color:red","el : " + (this.$el)); //已被初始化
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
mounted: function() {
console.group('------mounted 挂载结束状态------');
console.log("%c%s", "color:red","el : " + this.$el); //已被初始化
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
beforeUpdate: function () {
console.group('beforeUpdate 更新前状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
updated: function () {
console.group('updated 更新完成状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
beforeDestroy: function () {
console.group('beforeDestroy 销毁前状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
destroyed: function () {
console.group('destroyed 销毁完成状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message)
}
})
</script>
</html>
Vue实例创建过程中调用的几个生命周期钩子
1. beforeCreate
与created
之间的生命周期
在这个生命周期之间,进行初始化事件,进行数据的观测,可以看到在created
时候数据已经和data
属性进行了绑定。
created
完毕后,el
还是undefined
2. created
与beforeMount
首先判断对象中是否有el
选项,如果没有el
选项,则停止编译,如下图,注释掉el: "#app"
接下来,如果在该Vue实例中,调用
vm.$mount(el)
,代码继续向后执行,如下图调用vm.$mount("#app"),代码则继续执行
template
参数选项的有无对生命周期的影响
1). Vue实例对象中有template
参数选项,则将其作为模板编译成render
函数;
2). 如果没有template
,则将外部HTML作为模板编译;
3). template
中的模板优先级要高于外部HTML的优先级。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue生命周期学习</title>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
<div id="app">
<!--html中修改的-->
<h1>{{message + '这是在outer HTML中的'}}</h1>
<h2></h2>
</div>
</body>
<script>
var vm = new Vue({
el: '#app',
template: "<h1>{{message +'这是在template中的'}}</h1>", //在vue配置项中修改的
data: {
message: 'Vue的生命周期'
},
//render: function(createElement) {
//return createElement('h1', 'this is createElement')
//},
created: function() {
},
mounted: function() {
}
// render函数 > template > 外部HTML标签
})
</script>
</html>
-
代码执行后:
template优先级高于外部HTML标签 -
将Vue中template注释掉,代码执行为:
则加载外部HTML标签
这就是为什么el
要在template
之前,因为Vue需要通过el
找到对应的外部标签。
-
render
函数,它是以createElement
作为参数,然后做渲染操作,而且我们可以直接潜入JSX。
打开上面代码render
函数注释,则执行
优先级为:render函数 > template > 外部HTML标签
3. beforeMount
与mounted
此时的Vue实例对象添加$el,并且替换掉挂在DOM元素。在之前console中打印的结果可以看到beforeMount
之前el
还是undefined
4. mounted
这时我们在看h1
标签中内容发生了变化。
5. beforeUpdate
钩子函数和updated
钩子函数间的生命周期
当Vue发现data
中的数据发生了改变,会触发对应组件的重新渲染,先后调用beforeUpdate
和updated
钩子函数。我们在控制台console
中输入:
vm.message = '触发组件更新'
组件更新
5. beforeDestroy
与destroyed
beforeDestroy
实例销毁之前调用。在这一步,实例仍然完全可用。
该钩子在服务器端渲染期间不被调用。
```destroyed`` `Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
该钩子在服务器端渲染期间不被调用。
网友评论