生命周期的示例图,可以参考 《Vue.js 初体验》 中的生命周期。
结合上面给的生命周期示例图,我们大致清楚Vue从创建到销毁的整个过程,接下来我们来利用代码讲解下具体每个钩子的实际作用。
1 |
|
如下图我们看到从创建到挂载的整个流程,特别注意的是,在beforeMount
时,我们可以看到el
还是[[ message ]]
(ps: 这里的 [ 指的是花括弧,因为hexo会把花括弧给视为关键字符),这里就是运用到了visual dom的原理,直到mounted
才把数据渲染进去。
小结:
beforecreated
:el 和 data 还未初始化,但是refs已经初始化完成了,refs也是只是拿到对象,属性方法还没渲染完毕([Vue warn]: Error in beforecreated hook)。created
:完成了 data 数据的初始化,el没有beforeMount
:完成了 el 和 data 初始化mounted
:完成挂载,refs的组件属性方法渲染完成
在控制台输入app.message = 'hello vue'
,会看到vue触发beforeUpdate
以及updated
。
至于销毁,app.$destroy()
,会触发beforeDestroy
和destroyed
,但是销毁之后,我们重新修改app.message = 'hello'
是不会再生效的了,也就是原先的dom依旧存在,但是已经无法使用vue来控制dom元素的变化了。
那么组件的生命周期是什么样的呢?我们同样也来做一下简单的模拟。
1 |
|
我们可以看到,props
的数据是跟data
的出现周期是一样的,组件是在父容器执行beforeMount
时初始化的,在beforeCreate
操作props
数据则会报错,因为那个时候还没挂载到app实例化对象上。还有注意一下parent beforeMount
,这个跟之前说的虚拟dom的原理一样,先占坑,然后再挂载。
在created
时,组件的props
数据出来了,注意组件的el
在beforeMount
时,是不会像父容器那样先占坑的,而是等到mounted
之后才把数据渲染上去,之后返回父容器的mounted
方法,才会把组件数据都渲染到dom上面去。
总结:
beforecreate : 举个栗子:可以在这加个loading事件
created :在这结束loading,还做一些初始化,实现函数自执行
mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情
beforeDestory: 你确认删除XX吗?
destoryed :当前组件已被删除,清空相关内容