返回首页

uni-app的生命周期

布莱克2026-05-31 21:45已编辑
Tip:文章封面与内容无关,作者旅游时拍摄,因为没什么值得把四季都错过!

当运行一个 uni-app 项目时,实际上有两个"大脑"在同时工作:

Vue 的生命周期:负责组件本身的创建、挂载、更新、销毁(管理数据、DOM/虚拟DOM)。

uni-app 的生命周期:负责页面的加载、显示、隐藏、卸载(管理应用/页面的状态,对应微信小程序的生命周期)


uni-app 应用级 vs 页面级 生命周期

生命周期类型所属文件触发时机执行次数
onLaunchApp.vue应用启动时全局只执行1次
onShowApp.vue应用从后台进入前台多次
onHideApp.vue应用从前台进入后台多次
onLoad页面 .vue页面加载时每个页面独立执行
onShow页面 .vue页面显示时每个页面多次
onReady页面 .vue页面首次渲染完成每个页面1次
onHide页面 .vue页面隐藏时每个页面多次
onUnload页面 .vue页面卸载时每个页面1次

应用级生命周期

就是监听“应用程序”这个整体,从生到死,以及从前台到后台的整个过程

onLaunch:应用的“出生”与“初始化”

这是应用启动时触发的第一个,也是唯一一个只触发一次的生命周期。

深入理解:
它不仅仅是代码执行的第一步,更是整个应用环境准备的黄金窗口。在 onLaunch 没有执行完毕前,你的页面其实还没有被真正渲染。这也是为什么常说,不要在 onLaunch 里做耗时太长的同步操作,否则用户会一直看到启动白屏。

适合做什么(重中之重):

  • 全局配置获取:从服务器拉取应用的基础配置(如 API 地址、功能开关、主题色)。
  • 全局登录态检查:检查本地存储中是否有 token,判断用户是“已登录”还是“未登录”。
  • 全局数据初始化:初始化 Vuex/Pinia 中的全局状态,或者设置 globalData。
  • 路由拦截:根据登录状态,决定是跳转到首页还是登录页(注意异步延迟跳转问题)。
  • 埋点与统计:发送应用启动事件,记录启动来源(通过 options 参数获取)。

应用级的 onLaunch 中的异步接口请求(如 uni.request、uni.login 等)不会阻塞页面级的生命周期执行。页面级的 onLoad、onShow 会立即执行,完全不管应用级的异步请求是否完成


onShow:应用的“前台”与“激活”

只要应用的状态从“后台”变为“前台”,onShow 就会被触发。

如何理解小程序的前台和后台

前台 (Foreground)

  • 定义:用户正在使用你的小程序,能看见它的界面,并能与之交互。
  • 对应生命周期:onShow (页面级和应用级都会触发)。此时,页面正在被用户看到和操作。

后台 (Background)

  • 定义:用户没有在使用你的小程序,看不见它的界面,但它可能还活着,进程驻留在内存中。
  • 对应生命周期:用户按下 Home 键或切换到其他 App 时,触发 App.onHide。小程序进入后台挂起状态。


适合做什么:

  • 刷新页面数据:这是最核心的用途。比如用户从详情页返回列表页,你希望在列表页 onShow 时重新拉取列表数据,以显示最新的状态。
  • 重新校验登录态:用户可能在后台切换了账号,或者 token 过期了,回到应用时可以重新校验一次。
  • 恢复应用状态:比如恢复音视频的播放,或者重连 WebSocket。
  • 场景值/参数处理:onShow 的参数里,可以获取到应用是通过什么方式被唤醒的(比如小程序码、分享卡片)。


onHide:应用的“后台”与“休眠”

只要有新的事件或界面覆盖了你的应用,onHide 就会触发。它是 onShow 的镜像。

深入理解:
onHide 触发时,你的应用界面还在,但用户看不到了。此时,应用会进入一个“冻结”或“低优先级”状态,以节省系统资源。操作系统可能在内存紧张时,销毁处于后台的应用。

适合做什么:

  • 暂停正在进行的操作:比如暂停背景音乐的播放、暂停视频、停止动画循环。
  • 保存临时数据或草稿:用户可能在输入框里写了一半的内容,担心应用被系统回收导致数据丢失,可以在 onHide 时自动保存草稿到本地。
  • 断开长连接:比如断开 WebSocket,以减少不必要的资源消耗。
  • 记录应用使用时长:埋点统计时,可以记录 onHide 的时间点,从而计算出用户在本轮会话中的停留时长。


页面级生命周期:

onLoad:页面创建时执行(只执行一次)

执行时机:页面被创建时,在 beforeCreatecreated 之间。

核心特点

  • ✅ 能拿到页面参数(路由传递的参数)
  • ✅ 只执行一次
  • ✅ 页面还未渲染,DOM 不存在


onShow:页面显示/切换前台时执行(可多次执行)

执行时机

  • 页面首次加载时(onLoad 之后)
  • 从其他页面返回时(navigateBack)
  • 从后台切回前台时
  • 从 tabBar 切换回来时


onReady:页面首次渲染完成时执行(只执行一次)

执行时机:页面第一次渲染完成后,相当于 Vue 的 mounted 之后。

核心特点

  • ✅ 可以安全地操作 DOM 和组件
  • ✅ 可以获取元素的位置、尺寸
  • ✅ 只执行一次


onHide:页面隐藏时执行(可多次执行)

执行时机

  • 跳转到其他页面时
  • 小程序切到后台时
  • 关闭当前页面时(但 onUnload 也会触发)


onUnload:页面销毁时执行(只执行一次)

执行时机

  • 调用 uni.navigateBack() 返回上一页
  • 调用 uni.redirectTo() 重定向
  • 调用 uni.reLaunch() 重启
  • Tab 页切换(Tab 页不会被销毁,所以不会触发)


uniapp相关跳转

跳转方法当前页(A)新页面(B)能否返回 AA 的生命周期B 的生命周期
navigateTo保留,推入栈新建✅ 能onHideonLoadonShow
redirectTo替换,移出栈新建❌ 不能onUnloadonLoadonShow
navigateBack不适用(用于返回)不适用-被返回的页面:onShow当前页面:onUnload
switchTab保留,缓存切换显示✅ 能(切换回)onHide首次:onLoadonShow;再次:仅 onShow
reLaunch销毁所有新建❌ 不能A 及所有页面:onUnloadonLoadonShow


assistant