生命周期的示例图,可以参考 《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 :当前组件已被删除,清空相关内容