onlaunch中无法直接获取完整launchoptions,需结合uni.getlaunchoptionssync()与uni.getenteroptionssync()(微信专用)合并补全,并通过ref包裹pinia状态、平台适配层及url参数兜底确保多端一致性。

onLaunch 里拿不到完整 launchOptions?
直接在 onLaunch 中调用 uni.getLaunchOptionsSync() 看似合理,但实际运行时可能返回空对象或缺失 query、scene —— 尤其在冷启动+带参数扫码进入时。这是因为部分平台(如微信)的 launch options 在 App 初始化阶段尚未完全就绪。
正确做法是:先用 uni.getLaunchOptionsSync() 获取同步值,再用 uni.getEnterOptionsSync() 补全(微信小程序专用),两者合并覆盖:
onLaunch(() => {
const syncOpts = uni.getLaunchOptionsSync()
const enterOpts = uni.getEnterOptionsSync?.() || {}
const fullOpts = {
...syncOpts,
query: { ...syncOpts.query, ...enterOpts.query },
scene: enterOpts.scene || syncOpts.scene
}
// 存入 Pinia 或全局 store
})
- 必须优先检查
uni.getEnterOptionsSync是否存在(仅微信支持) -
scene值为数字(如1007、1047),需自行映射为语义化标识 - 扫码进来的
query可能含 URL 编码,需用decodeURIComponent处理
页面 onLoad 拿不到最新参数?
很多开发者在页面 onLoad 里直接读取 store 中的 launchOptions,却发现仍是旧值或 null —— 因为 onLaunch 和页面生命周期不同步,onLoad 可能早于 store 更新完成。
解决方式不是加 setTimeout,而是用响应式监听 + fallback:
import { useLaunchOptionsStore } from '@/store/modules/launchOptions'
const store = useLaunchOptionsStore()
onLoad((options) => {
// 1. 先用 URL 参数兜底(最可靠)
const id = options.id || ''
// 2. 再尝试读 store,但加 watchEffect 等待就绪
if (!store.launchOptions) {
watchEffect(() => {
if (store.launchOptions) {
console.log('launchOptions ready:', store.launchOptions)
}
}, { flush: 'post' })
}
})
- URL 参数永远优先,它是当前页面最确定的上下文来源
-
watchEffect配合flush: 'post'可避免首次渲染阻塞 - 不要在
onLoad里直接 await store 的异步初始化逻辑(uni-app 不支持)
全局配置如何实时同步到所有页面?
单纯把配置存进 Pinia 并不能自动触发页面重渲染 —— 页面组件不会响应 store 中非 reactive 的字段变更。常见错误是把整个 launchOptions 对象赋值给 state,但没用 ref 或 reactive 包裹。
Pinia store 必须确保字段可响应:
export const useLaunchOptionsStore = defineStore('launchOptions', {
state: () => ({
launchOptions: ref(null) as Ref<any>, // ✅ 必须用 ref 包裹
scene: computed(() => store.launchOptions?.value?.scene || 0),
query: computed(() => store.launchOptions?.value?.query || {})
}),
actions: {
setLaunchOptions(opts) {
this.launchOptions.value = opts // ✅ 触发响应
}
}
})</any>
-
ref(null)是关键,否则launchOptions字段不可响应 - 避免直接解构赋值:
this.launchOptions = opts❌(会丢失响应性) - 复杂嵌套结构建议用
shallowRef+ 手动triggerRef控制更新粒度
多端配置不一致怎么处理?
同一个小程序,在微信、支付宝、QQ 小程序中获取的 scene 值、query 格式、甚至 API 支持度都不同。硬编码判断容易失控。
推荐按平台做配置适配层:
// utils/launchAdapter.js
export function normalizeLaunchOptions(opts, platform = uni.getSystemInfoSync().platform) {
if (platform === 'mp-weixin') {
return { ...opts, scene: parseWeixinScene(opts.scene) }
}
if (platform === 'mp-alipay') {
return { ...opts, query: alipayQueryFix(opts.query) }
}
return opts
}
- 把平台差异收口到一个函数里,后续增删平台只需改这里
- 不要在业务组件里写
process.env.UNI_PLATFORM === 'mp-weixin'条件编译 - 测试时务必真机验证各端,模拟器常掩盖平台差异
真正难的不是“怎么拿参数”,而是参数拿到后,如何让每个页面都能以最小成本感知变更并保持状态一致性。响应式 store + 平台适配层 + URL 参数兜底,三者缺一不可。漏掉任意一环,都会在某个渠道、某次冷启动时突然失效。











