官方给的东西确定很官方啦,不过单看一张图对理解vue生命周期钩子函数来讲确定仍是有些难度的。不过各位小伙伴不要着急,本文 以简单直接的实例 来对此图进行理解。html
来吧 上代码!代码直接能够直接运行哦。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue-LifeClyle</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app" class="jing">
<p>{{message}}</p>
<keep-alive>
<jh-component msg="2017年6月9日" v-if="show"></jh-component>
</keep-alive>
</div>
</body>
<script>
var haohao = {
template: '<div>from haohao: {{msg}}</div>',
props: ['msg'],
deactivated: function() {
console.log('component deactivated!');
},
activated: function() {
console.log('component activated');
}
};
var app = new Vue({
el: '#app',
data: function() {
return {
message: 'jingjing',
show: true //控制子组件是否显示
};
},
beforeCreate: function() {
console.group('beforeCreate Vue实例建立前的状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(state);
},
created: function() {
console.group('created Vue实例建立完毕后状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(state);
},
beforeMount: function() {
console.group('beforeMount 挂载前状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
mounted: function() {
console.group('mounted 挂载后状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
beforeUpdate: function() {
console.group('beforeUpdate 更新前状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
console.log('beforeUpdate = ' + document.getElementsByTagName('p')[0].innerHTML);
},
updated: function() {
console.group('updated 更新完成状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
console.log('Updated = ' + document.getElementsByTagName('p')[0].innerHTML);
},
beforeDestroy: function() {
console.group('beforeDestroy 销毁前状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
destroyed: function() {
console.group('destroyed 销毁完成状态————————————————————');
var state = {
'el': this.$el,
'data': this.$data,
'message': this.message
}
console.log(this.$el);
console.log(state);
},
components: {
'jh-component': haohao
}
});
</script>
<style>
.jing {
font-size: 50px;
font-weight: bolder;
}
</style>
</html>
复制代码
建立了一个 app 的Vue根实例,将其挂载到页面 id 为 app 的 Dom 元素上。 而后局部注册了一个组件名为 haohao 并在根实例中将其注册,使其能够在根实例的做用域中使用。 将子组件用
<keep-alive>
包裹,为接下来的测试做准备。前端
关于
<keep-alive>
的问题就不在这里做过多阐述了,你们能够参考如下两篇文章
一、zhuanlan.zhihu.com/p/96740001
二、www.jianshu.com/p/4b55d312d…vue
beforeCreate
执行时:data
和el
均未初始化,值为undefined
created
执行时:Vue
实例观察的数据对象 data
已经配置好,已经能够获得app.message
的值,但 Vue
实例使用的根 DOM
元素el
还未初始化beforeMount
执行时:data
和 el
均已经初始化,但从{{message}}
的展现状况能够看出此时 el
并无渲染数据,这里就是应用的 Virtual DOM
(虚拟Dom)技术,先把坑占住了。到后面 mounted
挂载的时候再把值渲染上去npm
mounted
执行时:此时 el 已经渲染完成并挂载到实例上api
咱们在控制台看到component activated
被打印出来了,说明子组件jh-component
被 <keep-alive>
包裹,随 el
的挂载而触发了。浏览器
而后咱们进行一些操做,在控制台输入 app.show = false
咱们再来看看有什么变化,测试结果以下图:bash
data
的值,因此会触发beforeUpdate
和updated
钩子函数,这里先无论这两个函数,咱们看到deactivated钩子已经触发,表示<keep-alive>
已经停用。
app.message = 'haohao'
beforeUpdate
和updated
触发时,el
中的数据都已经渲染完成,但根据控制台打印的信息beforeUpdate = jingjing
而updated = haohao
可知,只有当updated
钩子被调用时候,组件dom
才会被更新。app.$destroy()
就能够将vue
实例销毁,可是咱们发现销毁前和销毁后的实例dom
结构没有任何改变,其实变化已经发生在了其余地方。Vue
实例指示的全部东西都会解除绑定,全部的事件监听器会被移除,全部的子实例也会被销毁。
app.message = 'jingjing'
发现结果以下图:data
中的message
属性,可是dom没有任何响应。说明Vue
实例指示的全部东西都已经解除了绑定。终于写完了😄😄😄做者只是一名前端大白(●—●) 此篇文章是第一篇,若是文中有错误请各位大佬谅解一下,指出错误就更好了,让新人多一个学习的机会。😊😊app
此篇文章写的很浅显,若是有须要对内容有更深刻的学习,能够看看大佬OBKoro写的文章—— Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]dom