一、是什么

跟vue、react框架一样,微信小程序框架也存在生命周期,实质也是一堆会在特定时期执行的函数

小程序中,生命周期主要分成了三部分:


应用的生命周期

小程序的生命周期函数是在app.js里面调用的,通过App(Object)函数用来注册一个小程序,指定其小程序的生命周期回调

页面的生命周期

页面生命周期函数就是当你每进入/切换到一个新的页面的时候,就会调用的生命周期函数,同样通过App(Object)函数用来注册一个页面

组件的生命周期

组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发,通过Component(Object)进行注册组件

二、有哪些

应⽤⽣命周期

App(Object object)

注册小程序。接受一个 Object 参数,其指定小程序的生命周期回调等。
App() 必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。

参数
Object object

属性 类型 默认值 必填 说明 最低版本
onLaunch function
生命周期回调——监听小程序初始化。
onShow function
生命周期回调——监听小程序启动或切前台。
onHide function
生命周期回调——监听小程序切后台。
onError function
错误监听函数。
onPageNotFound function
页面不存在监听函数。 1.9.90
onUnhandledRejection function
未处理的 Promise 拒绝事件监听函数。 2.10.0
onThemeChange function
监听系统主题变化 2.11.0
其他 any
开发者可以添加任意的函数或数据变量到 Object 参数中,用 this 可以访问

关于小程序前后台的定义和小程序的运行机制,请参考运行机制章节。

onLaunch(Object object)

小程序初始化完成时触发,全局只触发一次。参数也可以使用 wx.getLaunchOptionsSync 获取。
参数:与 wx.getLaunchOptionsSync 一致

onShow(Object object)

小程序启动,或从后台进入前台显示时触发。也可以使用 wx.onAppShow 绑定监听。
参数:与 wx.onAppShow 一致

onHide()

小程序从前台进入后台时触发。也可以使用 wx.onAppHide 绑定监听。

onError(String error)

小程序发生脚本错误或 API 调用报错时触发。也可以使用 wx.onError 绑定监听。
参数:与 wx.onError 一致

onPageNotFound(Object object)

基础库 1.9.90 开始支持,低版本需做兼容处理
小程序要打开的页面不存在时触发。也可以使用 wx.onPageNotFound 绑定监听。注意事项请参考 wx.onPageNotFound
参数:与 wx.onPageNotFound 一致
示例代码:

  1. App({
  2. onPageNotFound(res) {
  3. wx.redirectTo({
  4. url: 'pages/...'
  5. }) // 如果是 tabbar 页面,请使用 wx.switchTab
  6. }
  7. })

onUnhandledRejection(Object object)

基础库 2.10.0 开始支持,低版本需做兼容处理
小程序有未处理的 Promise 拒绝时触发。也可以使用 wx.onUnhandledRejection 绑定监听。注意事项请参考 wx.onUnhandledRejection
参数:与 wx.onUnhandledRejection 一致

onThemeChange(Object object)

基础库 2.11.0 开始支持,低版本需做兼容处理
系统切换主题时触发。也可以使用 wx.onThemeChange 绑定监听。
参数:与 wx.onThemeChange 一致
示例代码:

  1. App({
  2. onLaunch (options) {
  3. // Do something initial when launch.
  4. },
  5. onShow (options) {
  6. // Do something when show.
  7. },
  8. onHide () {
  9. // Do something when hide.
  10. },
  11. onError (msg) {
  12. console.log(msg)
  13. },
  14. globalData: 'I am global data'
  15. })

页面生命周期

生命周期 描述 作用
onLoad 生命周期回调-监听页面加载 发送请求获取数据
onShow 生命周期回调-监听页面显示 请求数据
onHide 生命周期回调-监听页面隐藏 终止任务,如定时器或播放音乐
onReady 生命周期回调-监听页面初次渲染完成 获取页面元素(少用)
onUnload 生命周期回调-监听页面卸载 终止任务

onLoad(Object query)

页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
参数:

名称 类型 说明
query Object 打开当前页面路径中的参数

onShow()

页面显示/切入前台时触发。

onReady()

页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
注意:对界面内容进行设置的 API 如wx.setNavigationBarTitle,请在onReady之后进行。详见生命周期

onHide()

页面隐藏/切入后台时触发。 如 wx.navigateTo 或底部 tab 切换到其他页面,小程序切入后台等。

onUnload()

页面卸载时触发。如wx.redirectTowx.navigateBack到其他页面时。

组件生命周期

生命周期 参数 描述
created 在组件实例刚刚被创建时执行
attached 在组件实例进入页面节点树时执行
ready 在组件在视图层布局完成后执行
moved 在组件实例被移动到节点树另一个位置时执行
detached 在组件实例被从页面节点树移除时执行
error Object Error 每当组件方法抛出错误时执行

定义生命周期方法

生命周期方法可以直接定义在 Component 构造器的第一级参数中。
自小程序基础库版本 2.2.3 起,组件的的生命周期也可以在 lifetimes 字段内进行声明(这是推荐的方式,其优先级最高)。
代码示例:

  1. Component({
  2. lifetimes: {
  3. attached: function() {
  4. // 在组件实例进入页面节点树时执行
  5. },
  6. detached: function() {
  7. // 在组件实例被从页面节点树移除时执行
  8. },
  9. },
  10. // 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容
  11. attached: function() {
  12. // 在组件实例进入页面节点树时执行
  13. },
  14. detached: function() {
  15. // 在组件实例被从页面节点树移除时执行
  16. },
  17. // ...
  18. })

组件所在页面生命周期

注意的是:
1.组件实例刚刚被创建好时, created 生命周期被触发,此时,组件数据 this.data 就是在 Component 构造器中定义的数据 data , 此时不能调用 setData
2.在组件完全初始化完毕、进入页面节点树后, attached 生命周期被触发。此时, this.data 已被初始化为组件的当前值。这个生命周期很有用,绝大多数初始化工作可以在这个时机进行
3.在组件离开页面节点树后, detached 生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则 detached 会被触发
还有一些特殊的生命周期,它们并非与组件有很强的关联,但有时组件需要获知,以便组件内部处理,这样的生命周期称为“组件所在页面的生命周期”,在 pageLifetimes 定义段中定义,如下:

生命周期 参数 描述
show 组件所在页面被展示时执行
hide 组件所在页面被隐藏时执行
resize Object Size 组件所在页面尺寸变化时执行

代码示例:

  1. Component({
  2. pageLifetimes: {
  3. show: function() {
  4. // 页面被展示
  5. },
  6. hide: function() {
  7. // 页面被隐藏
  8. },
  9. resize: function(size) {
  10. // 页面尺寸变化
  11. }
  12. }
  13. })

三、执行过程

应⽤的⽣命周期执行过程

1.⽤户⾸次打开⼩程序,触发 onLaunch(全局只触发⼀次)
2.⼩程序初始化完成后,触发onShow⽅法,监听⼩程序显示
3.⼩程序从前台进⼊后台,触发 onHide⽅法
4.⼩程序从后台进⼊前台显示,触发 onShow⽅法
5.⼩程序后台运⾏⼀定时间,或系统资源占⽤过⾼,会被销毁

⻚⾯⽣命周期的执行过程

1.⼩程序注册完成后,加载⻚⾯,触发onLoad⽅法
2.⻚⾯载⼊后触发onShow⽅法,显示⻚⾯
3.⾸次显示⻚⾯,会触发onReady⽅法,渲染⻚⾯元素和样式,⼀个⻚⾯只会调⽤⼀次
4.当⼩程序后台运⾏或跳转到其他⻚⾯时,触发onHide⽅法
5.当⼩程序有后台进⼊到前台运⾏或重新进⼊⻚⾯时,触发onShow⽅法
6.当使⽤重定向⽅法 wx.redirectTo() 或关闭当前⻚返回上⼀⻚wx.navigateBack(),触发onUnload
当存在也应用生命周期和页面周期的时候,相关的执行顺序如下:

  1. 1.打开小程序:(App)onLaunch --> (App)onShow --> (Pages)onLoad --> (Pages)onShow --> (pages)onRead
  2. 2.进入下一个页面:(Pages)onHide --> (Next)onLoad --> (Next)onShow --> (Next)onReady
  3. 3.返回上一个页面:(curr)onUnload --> (pre)onShow
  4. 4.离开小程序:(App)onHide
  5. 5.再次进入:小程序未销毁 --> (App)onShow(执行上面的顺序),小程序被销毁,(App)onLaunch重新开始执行.