onlaunch和onshow均需处理extradata但逻辑不同:onlaunch用于初始化,onshow须每次覆盖缓存以避免旧数据残留;globaldata修改需同步且可追踪,推荐封装setter方法;页面无法在onload获取extradata,应提前存入globaldata或store;跨分包时getapp()可能失效,建议用$vm或storagesync替代。

onLaunch 和 onShow 都要处理 extraData,但逻辑不能一样
小程序冷启动时,App.onLaunch 会拿到 extraData;热启动(比如从聊天页跳转)时,onLaunch 不触发,只走 App.onShow。很多人只在 onLaunch 里取参数,结果热启动就丢失数据。
-
onLaunch适合做初始化:比如判断是否首次进入、存初始状态 -
onShow必须每次检查options.extraData,哪怕为空也要覆盖当前缓存值,避免旧数据残留 - 两者都要调用同一个解析函数,比如
parseExtraData(options.extraData),保证逻辑一致
globalData 修改必须同步且可追踪
globalData 是浅引用对象,直接赋值字段(如 app.globalData.userId = 123)不会触发响应式更新,组件里读不到变化。也不能用 this.setData——那是小程序原生 API,uni-app 里无效。
- 修改前先确保
getApp()返回的是当前实例,尤其在异步回调中容易拿错 - 推荐封装 setter 方法:
app.setGlobal('userInfo', { name: 'xxx' }),内部用Object.assign或重新赋值整个字段 - 如果用 Vue 3 +
setup,别直接读app.globalData,应配合ref或store做响应式桥接
页面 onLoad 拿不到分享或跳转参数?检查 options 来源
页面 onLoad 的 options 只包含 URL query 参数(如 ?id=123),不包含 extraData。后者只存在于 App 级生命周期里。
- 想在页面里用
extraData,必须提前在onShow中写入globalData或Pinia store - 不要在
onLoad里调用uni.getLaunchOptionsSync()——它只返回冷启动时的值,热启动为空 - 调试时打印
JSON.stringify(options),确认字段名是否被微信转义(比如scene转成数字,extraData是对象但可能被序列化成字符串)
跨分包场景下 globalData 会失效?用 $vm 替代
uni-app 分包加载后,getApp() 在子包页面里可能返回空或旧实例,导致 globalData 读不到最新值。
- 优先用
uni.$u或uni.$vm(如果项目启用了全局 vm)替代getApp() - 更稳妥的方式是把关键参数存在
uni.setStorageSync,页面按需读取并清理 - 如果必须用
globalData,在子包页面onLoad开头加个兜底:const app = getApp(); if (!app.globalData.userInfo) app = getApp(true);
onShow 拿到的 extraData 可能和上一次内容完全一样,但你必须当作新数据重新解析和覆盖,否则业务逻辑就卡在旧状态里。











