onload 拿不到 this.data 是因为页面数据尚未初始化,此时应使用参数 options 传值;依赖 data 的逻辑需移至 onready 或用 this.$nexttick(h5 降级为 settimeout);onshow/onunload 触发受路由栈和平台机制约束;vue 钩子在页面级不执行,仅组件内有效;onbackpress 返回 true 后需显式处理导航。

onLoad 为什么拿不到 this.data?
因为 onLoad 触发时,页面数据尚未完成初始化,this.data 还是空对象或默认值。这时候读取 this.data.xxx 大概率是 undefined,但 this 本身可用——真正要读的是 options 参数。
-
onLoad的参数options是 URL query(如?id=123&type=detail)解析后的对象,直接用它传参,别绕路去读this.data - 需要依赖 data 初始化后操作的逻辑,挪到
onReady或用this.$nextTick包一层(uni-app 2.7+ 支持) - H5 端在
onLoad中调this.$nextTick可能不生效,得降级为setTimeout(() => {}, 0)
onShow 和 onUnload 的触发边界在哪?
onShow 不是每次“看到页面”都触发,onUnload 也不是每次“离开就调用”——它们受路由栈和平台机制强约束。
-
onShow在页面从「后台切回前台」或「从其他页面返回当前页」时触发;但 TabBar 页面切换时,onShow必定触发,onHide也必定配对 -
onUnload只在页面被销毁时调用(比如uni.navigateTo跳走且没缓存),但uni.switchTab或uni.reLaunch后,当前页可能被静默卸载,也可能复用(尤其 App 端) - App 和小程序中,
onUnload可能不触发:比如用户按系统返回键退出 App,或小程序被微信回收进程
Vue 选项式写法里,created/mounted 会执行吗?
不会。uni-app 页面生命周期和 Vue 生命周期不重叠——created、mounted 等钩子在页面实例中被忽略,连日志都不会打。
- 所有逻辑必须写在
onLoad、onShow、onReady等 uni 提供的钩子里 - 如果你在
script顶层写了变量声明或函数定义,那没问题;但别指望mounted() {}自动执行 - 组件内部(
.vue子组件)仍可正常使用mounted,但页面级 .vue 文件的根实例不认 Vue 钩子
App 端 onBackPress 拦截后,为什么再次点击返回键没反应?
因为 onBackPress 返回 true 表示已自行处理,uni-app 就不再触发默认返回行为;但如果没做任何 UI 响应或状态更新,用户会以为“卡了”。
- 必须显式控制导航:比如弹窗确认、
uni.navigateBack()、或uni.switchTab() - 返回
false或不返回值,才会走默认返回逻辑(关闭当前页) - App 端 Android 物理返回键连续快速点击时,
onBackPress可能只触发一次,后续点击取决于你是否重置了拦截状态
onLoad 之后马上能读到响应式数据,或觉得 onUnload 总能清理定时器。实际得按平台文档查清触发条件,再加日志验证。










