当运行一个 uni-app 项目时,实际上有两个"大脑"在同时工作:
Vue 的生命周期:负责组件本身的创建、挂载、更新、销毁(管理数据、DOM/虚拟DOM)。
uni-app 的生命周期:负责页面的加载、显示、隐藏、卸载(管理应用/页面的状态,对应微信小程序的生命周期)
| 生命周期类型 | 所属文件 | 触发时机 | 执行次数 |
|---|---|---|---|
onLaunch | App.vue | 应用启动时 | 全局只执行1次 |
onShow | App.vue | 应用从后台进入前台 | 多次 |
onHide | App.vue | 应用从前台进入后台 | 多次 |
onLoad | 页面 .vue | 页面加载时 | 每个页面独立执行 |
onShow | 页面 .vue | 页面显示时 | 每个页面多次 |
onReady | 页面 .vue | 页面首次渲染完成 | 每个页面1次 |
onHide | 页面 .vue | 页面隐藏时 | 每个页面多次 |
onUnload | 页面 .vue | 页面卸载时 | 每个页面1次 |
就是监听“应用程序”这个整体,从生到死,以及从前台到后台的整个过程
onLaunch:应用的“出生”与“初始化”这是应用启动时触发的第一个,也是唯一一个只触发一次的生命周期。
深入理解:
它不仅仅是代码执行的第一步,更是整个应用环境准备的黄金窗口。在 onLaunch 没有执行完毕前,你的页面其实还没有被真正渲染。这也是为什么常说,不要在 onLaunch 里做耗时太长的同步操作,否则用户会一直看到启动白屏。
适合做什么(重中之重):
应用级的 onLaunch 中的异步接口请求(如 uni.request、uni.login 等)不会阻塞页面级的生命周期执行。页面级的 onLoad、onShow 会立即执行,完全不管应用级的异步请求是否完成
onShow:应用的“前台”与“激活”只要应用的状态从“后台”变为“前台”,onShow 就会被触发。
如何理解小程序的前台和后台
适合做什么:
onHide:应用的“后台”与“休眠”只要有新的事件或界面覆盖了你的应用,onHide 就会触发。它是 onShow 的镜像。
深入理解:onHide 触发时,你的应用界面还在,但用户看不到了。此时,应用会进入一个“冻结”或“低优先级”状态,以节省系统资源。操作系统可能在内存紧张时,销毁处于后台的应用。
适合做什么:
onLoad:页面创建时执行(只执行一次)执行时机:页面被创建时,在 beforeCreate 和 created 之间。
核心特点:
onShow:页面显示/切换前台时执行(可多次执行)执行时机:
onReady:页面首次渲染完成时执行(只执行一次)执行时机:页面第一次渲染完成后,相当于 Vue 的 mounted 之后。
核心特点:
onHide:页面隐藏时执行(可多次执行)执行时机:
onUnload:页面销毁时执行(只执行一次)执行时机:
| 跳转方法 | 当前页(A) | 新页面(B) | 能否返回 A | A 的生命周期 | B 的生命周期 |
|---|---|---|---|---|---|
navigateTo | 保留,推入栈 | 新建 | ✅ 能 | onHide | onLoad → onShow |
redirectTo | 替换,移出栈 | 新建 | ❌ 不能 | onUnload | onLoad → onShow |
navigateBack | 不适用(用于返回) | 不适用 | - | 被返回的页面:onShow | 当前页面:onUnload |
switchTab | 保留,缓存 | 切换显示 | ✅ 能(切换回) | onHide | 首次:onLoad→onShow;再次:仅 onShow |
reLaunch | 销毁所有 | 新建 | ❌ 不能 | A 及所有页面:onUnload | onLoad → onShow |
