你不知道的小程序系列之生命周期执行顺序
发布于 5 年前 作者 yongshao 845 次浏览 来自 分享

再次开始之前先问几个问题:

你是否知道Page生命周期 与 pagelifetimes 生命周期执行顺序?

你是否知道behaviors中的生命周期与组件生命周期执行顺序?

你是否知道Page生命周期 与 组件pagelifetimes生命周期执行顺序?

要回答上面的问题,首先我们看看小程序生命周期有哪些:

App

  • onLaunch
  • onShow
  • onHide

Page

  • onLoad
  • onShow
  • onReady
  • onHide
  • onUnload

Component

  • created
  • attached
  • ready
  • moved
  • detached

想一下加载一个页面(包含组件)的加载顺序,按照直觉小程序加载顺序应该是这样的加载顺序(以下列子中Component都是同步组件):

App(onLaunch) -> Page(onLoad) -> Component(created)

但其实并不然,小程序的加载顺序是这样的:

  • 首先执行 App.onLaunch -> App.onShow
  • 其次执行 Component.created -> Component.attached
  • 再执行 Page.onLoad -> Page.onShow
  • 最后 执行 Component.ready -> Page.onReady

其实也不难理解微信这么设计背后的逻辑,我们先看下官方的的生命周期:

可以看到,在页面onLoad之前会有页面create阶段,这其中就包含了组件的初始化,等组件初始化完成之后,才会执行页面的onLoad, 之后页面ready事件也是在组件ready之后才触发的。

下面我们来看看 Behavior, BehaviorVue中的 mixin 类似,猜想下其中的执行顺序:

Behavior.created => Component.created

测试下来和预期相符,其实在Vue的文档中有一段这样的描述:

另外,混入对象的钩子将在组件自身钩子__之前__调用。

这样的设计和主流设计保持一致。接下来我们看看 pageLifetimes,有showhide生命周期对应页面的展示与隐藏,预期的执行顺序:

pageLifetime.show => Page.onShow

测试下来也和预期相符,那么我们可以推断出如下的结论:

当页面中包含组件时,组件的生命周期(包括pageLifetimes)总是优先于页面,Behaviors生命周期优先于组件的生命周期。但其实有个例外:页面退出堆栈,当页面unload时会执行如下顺序:

Page.onUnload => Component.detached

看了以上的分析你应该知道了答案,最后做个总结(demo):

最后的最后布置个作业

异步组件(异步渲染的组件,通常是通过if条件判断是否渲染)的生命周期执行顺序是怎样的,pagelifetimes会不会执行?

2 回复

总是对这些条条框框比较铭感

回到顶部