一、小程序生命周期概述

微信小程序的生命周期是指小程序从启动到销毁的整个过程,包含了多个关键节点和回调函数。理解小程序的完整生命周期对于开发高质量的小程序应用至关重要,它帮助开发者掌握资源分配、数据初始化和清理的时机。

小程序生命周期主要分为三个层次:

  1. 应用生命周期 - 整个小程序的生命周期

  2. 页面生命周期 - 单个页面的生命周期

  3. 组件生命周期 - 自定义组件的生命周期

二、应用生命周期

应用生命周期指的是整个小程序的存活周期,从启动到销毁的全过程。开发者可以在app.js中通过App()函数注册小程序,并定义以下生命周期回调函数:

主要回调函数

  1. onLaunch(options)

    • 小程序初始化时触发,全局只触发一次

    • 参数options包含小程序启动时的场景值、路径等

  2. onShow(options)

    • 小程序启动或从后台进入前台时触发

    • 参数options与onLaunch相同,包含场景值等信息

  3. onHide()

    • 小程序从前台进入后台时触发

    • 适合在此保存应用状态

  4. onError(error)

    • 小程序发生脚本错误或API调用失败时触发

    • 参数error包含错误信息

  5. onPageNotFound(options)

    • 要打开的页面不存在时触发

    • 可以进行页面重定向处理

代码示例

// app.js
App({
  onLaunch(options) {
    console.log('小程序初始化', options);
    // 可以在这里进行登录验证、获取系统信息等操作
  },
  onShow(options) {
    console.log('小程序显示', options.scene);
  },
  onHide() {
    console.log('小程序隐藏');
  },
  onError(err) {
    console.error('小程序错误:', err);
  },
  globalData: {
    userInfo: null
  }
});

三、页面生命周期

页面生命周期是指小程序中单个页面的存活周期,每个页面都有自己的生命周期。开发者可以在页面的.js文件中通过Page()函数注册页面,并定义以下生命周期回调函数:

主要回调函数

  1. onLoad(options)

    • 页面加载时触发,一个页面只会调用一次

    • 参数options包含打开当前页面路径中的参数

  2. onShow()

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

  3. onReady()

    • 页面初次渲染完成时触发,一个页面只会调用一次

    • 表示页面已准备妥当,可以和视图层进行交互

  4. onHide()

    • 页面隐藏/切入后台时触发

  5. onUnload()

    • 页面卸载时触发,如页面被重定向或navigateBack到其他页面

  6. onPullDownRefresh()

    • 用户下拉刷新时触发

    • 需要先在页面配置中开启enablePullDownRefresh

  7. onReachBottom()

    • 用户上拉触底时触发

  8. onShareAppMessage(options)

    • 用户点击右上角分享时触发

    • 需要return一个对象,自定义分享内容

代码示例

// pages/index/index.js
Page({
  data: {
    title: '首页'
  },
  onLoad(options) {
    console.log('页面加载', options);
    // 可以在这里根据options参数初始化页面数据
  },
  onShow() {
    console.log('页面显示');
  },
  onReady() {
    console.log('页面初次渲染完成');
  },
  onHide() {
    console.log('页面隐藏');
  },
  onUnload() {
    console.log('页面卸载');
  },
  onPullDownRefresh() {
    console.log('下拉刷新');
    // 处理刷新逻辑
    wx.stopPullDownRefresh();
  },
  onReachBottom() {
    console.log('触底加载');
    // 加载更多数据
  },
  onShareAppMessage() {
    return {
      title: '分享标题',
      path: '/pages/index/index'
    }
  }
});

四、组件生命周期

自定义组件也有自己的生命周期,从创建到销毁的整个过程。开发者可以在Component构造器中定义这些生命周期函数。

主要生命周期函数

  1. created()

    • 组件实例刚刚被创建时执行

    • 此时还不能调用setData

  2. attached()

    • 组件实例进入页面节点树时执行

    • 此时可以调用setData初始化数据

  3. ready()

    • 组件在视图层布局完成后执行

    • 类似于页面的onReady

  4. moved()

    • 组件实例被移动到节点树另一个位置时执行

  5. detached()

    • 组件实例从页面节点树移除时执行

    • 适合清理工作

  6. error(err)

    • 组件方法抛出错误时执行

新增的生命周期函数(基础库2.2.3起)

  1. show()

    • 组件所在的页面被展示时执行

  2. hide()

    • 组件所在的页面被隐藏时执行

  3. resize(size)

    • 组件所在的页面尺寸变化时执行

代码示例

// components/my-component/my-component.js
Component({
  lifetimes: {
    created() {
      console.log('组件实例被创建');
    },
    attached() {
      console.log('组件进入页面节点树');
      this.setData({ message: 'Hello' });
    },
    ready() {
      console.log('组件视图层布局完成');
    },
    detached() {
      console.log('组件从页面节点树移除');
    }
  },
  // 旧式定义方式(兼容)
  attached() {
    console.log('旧式attached');
  },
  // 页面生命周期
  pageLifetimes: {
    show() {
      console.log('页面展示');
    },
    hide() {
      console.log('页面隐藏');
    },
    resize(size) {
      console.log('页面尺寸变化', size);
    }
  }
});

五、生命周期执行顺序

理解各生命周期函数的执行顺序对于正确初始化数据和避免错误至关重要。

小程序启动时的执行顺序

  1. 应用onLaunch

  2. 应用onShow

  3. 页面onLoad

  4. 页面onShow

  5. 页面onReady

页面切换时的执行顺序

当从页面A跳转到页面B:

  1. 页面A onHide

  2. 页面B onLoad

  3. 页面B onShow

  4. 页面B onReady

当从页面B返回到页面A:

  1. 页面B onUnload

  2. 页面A onShow

组件与页面的生命周期顺序

页面包含组件时的初始化顺序:

  1. 页面onLoad

  2. 组件created

  3. 组件attached

  4. 页面onShow

  5. 页面onReady

  6. 组件ready

六、生命周期最佳实践

  1. 数据初始化

    • 页面级数据初始化放在onLoad中

    • 组件数据初始化放在attached中

    • 避免在onShow中频繁初始化数据

  2. 资源管理

    • 在onUnload和detached中清理定时器、事件监听等

    • 避免内存泄漏

  3. 性能优化

    • 将耗时操作放在onLoad而非onShow中

    • 使用onReady执行需要访问DOM的操作

  4. 错误处理

    • 在onError中记录错误信息

    • 使用try-catch包裹可能出错的操作

  5. 状态恢复

    • 利用onHide保存当前状态

    • 在onShow中恢复必要状态

七、常见问题与解决方案

  1. onLoad和onShow的区别

    • onLoad只执行一次,适合一次性初始化

    • onShow每次页面显示都会执行,适合刷新数据

  2. 页面跳转时数据传递

    • 少量数据可以通过URL参数传递

    • 大量数据可以使用全局变量或缓存

  3. 组件生命周期与页面生命周期的协调

    • 注意组件可能比页面更早初始化

    • 使用pageLifetimes处理页面状态变化

  4. 生命周期函数不触发

    • 检查函数名是否拼写正确

    • 确保在正确的对象中定义

  5. 异步操作与生命周期的协调

    • 在onLoad中发起请求

    • 在回调中检查页面是否还存在(setData前检查)

结语

深入理解微信小程序的生命周期是开发稳定、高效小程序应用的基础。通过合理利用各个生命周期回调函数,开发者可以更好地控制资源分配、数据初始化和清理工作,从而提升用户体验和应用性能。随着小程序功能的不断丰富,生命周期管理也变得更加复杂,掌握这些核心概念将帮助开发者应对各种复杂的应用场景。

更多推荐