uni-app生命周期分为App、Page、Component三类:App级(如onLaunch)、Page级(如onLoad/onShow)、Component级(created/mounted或pageLifetimes)。onLoad仅一次且接收URL参数,onShow每次显示触发;组件需显式声明pageLifetimes才能监听页面事件;onUnload跨端时机不一,onBackPress不支持H5。
uni-app 的生命周期钩子分哪几类
uni-app 的生命周期不是一套统一函数,而是按运行环境拆成三套:app(小程序/app)、page(页面)、component(组件),各自有独立钩子,混用会失效。
最常被忽略的是:在 onLoad 里访问 this.data 可能是空的——因为 Vue 实例还没完成初始化,data 尚未响应式代理,此时应改用 onReady 或在 mounted 中操作(仅 Vue 模式下有效)。
- App 级:如
onLaunch、onShow,写在App.vue的script中 - Page 级:如
onLoad、onShow、onUnload,写在页面.vue文件的export default对象里 - Component 级:只有
created、mounted(Vue 模式),pageLifetimes(非 Vue 模式,需显式声明)
onLoad 和 onShow 的关键区别与误用场景
onLoad 只触发一次,参数来自 URL query(如 ?id=123),适合初始化数据;onShow 每次页面显示都触发(包括从后台切回),适合刷新状态或检查登录态。
常见错误是把网络请求全塞进 onShow,导致频繁重载;或在 onLoad 里调用 uni.getStorageSync 后直接赋值给 data 字段却忘了用 this.$set 或响应式语法,造成视图不更新。
-
onLoad参数是对象,不是字符串:onLoad(options) { console.log(options.id) } -
onShow不带参数,不能用来取 URL 参数 - 在条件编译为 H5 时,
onShow不会触发(H5 无“后台切回”概念),需用visibilitychange事件兜底
组件中如何正确使用 pageLifetimes
自定义组件无法直接监听页面级生命周期,必须通过 pageLifetimes 声明对象才能接收 show、hide、resize 等事件——这是 uni-app 特有的机制,Vue 原生没有。
漏写 pageLifetimes 是高频失误。比如你在组件里写了 onShow() {},但没包在 pageLifetimes: { onShow() {} } 里,这个函数永远不会执行。
- 必须写在组件
export default的顶层对象中,和data、methods同级 -
pageLifetimes.show触发时机与页面的onShow一致,但只在该组件所在页面显示时触发 - 不支持
onLoad,因为组件不参与路由参数解析
跨端兼容性陷阱:onUnload 和 onBackPress
onUnload 在所有平台都可用,但实际触发时机不一致:微信小程序中页面跳转即触发;App 端需手动调用 uni.navigateBack 才触发;H5 则依赖 beforeunload,且无法阻止刷新。
想拦截返回操作?别只依赖 onBackPress:它只在 App 和小程序生效,H5 完全不触发。真正可靠的做法是结合 onBackPress + plus.webview.currentWebview().setStyle({backButtonAutoControl: false})(App 端)+ H5 的 window.history.pushState 模拟栈。
-
onBackPress返回true表示已自行处理,不再执行默认返回逻辑 - 在 TabBar 页面中,
onBackPress默认不触发(除非主动启用) -
onUnload中不适合做异步操作(如上报日志),因部分平台可能已销毁上下文
mounted 和 onReady 的分工——前者是 Vue 实例挂载完成,后者是页面渲染完成并可操作 DOM,两者时间点不同,用途也不同。


















