你必读的vue生命周期知识

2,250 阅读4分钟

之前一直对vue生命周期的执行顺序理解比较含糊,这一次我用几个简单的例子把几种情况统一的整理和记录一下。

一个组件的生命周期

一个页面常使用的生命周期有下面几个:

beforeCreate
created
beforeMount
mounted
beforeDestroy
destroyed

如果只有一个组件,那很好理解,直接按照顺序执行就是了。在组件初始化渲染的时候它会执行下面四个:

beforeCreate
created
beforeMount
mounted

在组件销毁的时候会执行下面两个:

beforeDestroy
destroyed

但是真实的情况不会这么理想,他可能会有很多组件,并且这些组件之间有父子级的关系,兄弟之间的关系。

接下来我增加一些难度,从一个组件增加到两个组件。然后这两个组件有两种情况:一种是父子关系,一种是兄弟关系,我们分别来分析。

两个组件之父子关系

假设现在有一个页面A,页面A有一个组件B。代码示意图如下:

// 页面A
<span>我是页面A</span>
<componentB />

此时渲染这个页面A的过程是这样的:

beforeCreate - 页面A
created - 页面A
beforeMount - 页面A
beforeCreate - 组件B
created - 组件B
beforeMount - 组件B
mounted - 组件B
mounted - 页面A

在执行页面A到生命周期函数beforeMount之后,开始执行组件B的生命周期函数,组件B渲染结束之后,再渲染A页面未完成的部分。

那一鼓作气,我把兄弟关系的执行顺序也搞出来。

两个组件之兄弟关系

先暂时忘记前面说的父子关系,回到这里来。假设现在有一个页面A,一个页面B。假设打开页面A,然后跳转到页面B,要经历什么?

你可以先想想哦!我先告诉你结论,等会再做解析。

beforeCreate - 页面A
created - 页面A
beforeMount - 页面A
mounted - 页面A
beforeCreate - 页面B
created - 页面B
beforeMount - 页面B
beforeDestroy - 页面A
destroyed - 页面A
mounted - 页面B

好啦,从页面A跳转到页面B的时候,会先执行目标页面B的初始化函数beforeCreate、created和beforeMount(这一点可能是很多人的误区,我曾经傻傻的以为先执行销毁页面A的函数),然后才开始执行销毁页面A的生命周期函数,销毁结束了才执行目标页面B的mounted。

好辣,两个情况都理解之后,这一篇文章的知识点基本就掌握了,先给你点个大大的赞。可是最后我手残了,想给自己做个课后练习巩固一下。

我记得高中老师说的一句话,“把简单的事情做到极致,你就是专家”。好吧,我对成为专家还是抱有一点期望。所以,奥利给,继续咯。

四个组件之大杂烩

把前面学到的知识做一个整理。比如现在有两个页面,每个页面内都有一个组件。页面A有一个组件A,页面B有一个组件B。示意图如下:

// 页面A
<span>我是页面A</span>
<componentA />

// 页面B
<span>我是页面B</span>
<componentB />

假设打开页面A,然后跳转到页面B,要经历什么?

我还是先把结论贴出来吧。

beforeCreate - 页面A
created - 页面A
beforeMount - 页面A
beforeCreate - 组件A
created - 组件A
beforeMount - 组件A
mounted - 组件A
mounted - 页面A

beforeCreate - 页面B
created - 页面B
beforeMount - 页面B
beforeCreate - 组件B
created - 组件B
beforeMount - 组件B

beforeDestroy - 页面A
beforeDestroy - 组件A
destroyed - 组件A
destroyed - 页面A
mounted - 组件B
mounted - 页面B

这里的beforeDestroy和destroyed需要特别注意一下。beforeDestroy是从父级往子级方向执行的,destroyed是子级往父级方向执行的。

总结

  • 父子组件间页面渲染会先执行beforeCreate、created、beforeMount,然后执行子组件并渲染完成,结束后执行父组件的mounted
  • 兄弟组件之间的切换不是我们之前想象的先销毁当前组件,再去渲染目标组件(这样会使白屏时间很长)。正确的姿势是先执行目标组件的beforeCreate、created、beforeMount,然后再执行当前组件的beforeDestroy和destroyed,销毁结束之后再执行目标组件的mounted。
  • 大杂烩情况下,需要学习的是beforeDestroy是从父级往子级方向执行的,destroyed是子级往父级方向执行的。

码字不易,如果对你有帮助希望能点赞或者收藏。

感谢阅读!