再次开始之前先问几个问题:
你是否知道Page
生命周期 与 pagelifetimes
生命周期执行顺序?
你是否知道behaviors
中的生命周期与组件生命周期执行顺序?
你是否知道Page
生命周期 与 组件pagelifetimes
生命周期执行顺序?
要回答上面的问题,首先我们看看小程序生命周期有哪些:
- onLaunch
- onShow
- onHide
- onLoad
- onShow
- onReady
- onHide
- onUnload
- 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
, Behavior
与 Vue
中的 mixin
类似,猜想下其中的执行顺序:
Behavior.created => Component.created
测试下来和预期相符,其实在Vue
的文档中有一段这样的描述:
另外,混入对象的钩子将在组件自身钩子之前调用。
这样的设计和主流设计保持一致。接下来我们看看 pageLifetimes
,有show
和hide
生命周期对应页面的展示与隐藏,预期的执行顺序:
pageLifetime.show => Page.onShow
测试下来也和预期相符,那么我们可以推断出如下的结论:
当页面中包含组件时,组件的生命周期(包括pageLifetimes)总是优先于页面,Behaviors
生命周期优先于组件的生命周期。但其实有个例外:页面退出堆栈,当页面unload
时会执行如下顺序:
Page.onUnload => Component.detached
看了以上的分析你应该知道了答案,最后做个总结(demo):
最后的最后布置个作业
异步组件(异步渲染的组件,通常是通过if条件判断是否渲染)的生命周期执行顺序是怎样的,pagelifetimes会不会执行?
可是我在开发中发现attached是晚于页面ready执行
切后台时,先触发page onhide还是app onhide
之后页面
ready
事件也是在组件ready
之后才触发的。请问这句话是如何得出的结论呢?从官方的生命周期图上只能看得出来当渲染层的线程Ready开始时,发送了notify信号给逻辑层的线程,逻辑层开始调用page的onReady方法,但是之后渲染层一直是出于Ready状态的,并不能判断Component的ready是page的onReady方法调用的前置条件吧
m
总是对这些条条框框比较铭感
学习啦