onShareAppMessage 必须在页面生命周期内(如 onLoad)注册,不能在 <script setup> 顶层调用;路径需以 / 开头且与 pages.json 一致;动态参数必须来自当前页面响应式状态,全局变量不可靠;需启用 manifest 中 share 模块且基础库 ≥2.27.0。

onShareAppMessage 必须在页面生命周期内注册
直接在 <script setup> 顶层调用 onShareAppMessage 是无效的——它不会被小程序运行时捕获。这个钩子必须在组件初始化阶段(如 onLoad、onShow 或 setup 同步执行区)注册,否则真机调试时分享按钮点击无响应。
常见错误现象:模拟器里看似能弹出分享卡片,但真机上点不动;或分享路径始终是默认值,动态变量未生效。
- 正确做法:在
onLoad中调用onShareAppMessage,并确保返回对象中所有字段都参与动态计算 - 路径必须以
/开头,且与pages.json中注册的完整路径一致(如/pages/detail/index,不能写成detail/index) - 避免在
onShareAppMessage外部提前声明闭包变量,否则可能捕获到旧值(尤其在页面复用场景下)
全局混入 + 页面级覆盖才是可靠组合
全局混入不是“一劳永逸”,而是提供兜底能力;页面级定义会完全替换全局逻辑,而非合并——这是官方机制,不是 bug。
这意味着你不能靠混入“叠加”参数,而要设计成“可覆盖”的结构。例如全局混入只提供基础配置和 getShareOptions() 方法,具体页面再按需调用并传入当前上下文数据。
- 全局混入文件(
/mixins/share.js)里不要硬编码title或path,而是暴露一个函数:getShareOptions({ title, path, query }) - 页面中调用时传入当前
ref或computed值,确保实时性:getShareOptions({ title: shareTitle.value, path: `/pages/item?id=${itemId.value}` }) - 如果页面不需要分享,显式导出空对象或不定义
onShareAppMessage,避免触发默认逻辑
动态参数依赖页面数据,不能靠全局状态“猜”
很多人试图把分享参数存在 getApp().globalData 或 app.config.globalProperties 里,等分享触发时再去读——这在小程序里极不可靠。页面实例和全局对象之间没有自动同步机制,globalData 变化不会触发分享逻辑重算。
真正有效的动态参数,必须来自当前页面的响应式状态,且在 onShareAppMessage 执行时能立即取到最新值。
- 不要用
getCurrentInstance().appContext.config.globalProperties.$shareData存值再读,它和页面生命周期脱钩 - 不要在混入里监听
globalData变更并手动刷新,小程序不支持这种响应式联动 - 推荐模式:每个页面自己管理分享所需的数据源(
ref、computed、useRoute().params),并在onShareAppMessage回调里直接消费
真机调试必须检查基础库版本和 manifest 配置
即使代码完全正确,onShareAppMessage 在真机上仍不触发,大概率是环境问题。微信小程序对分享 API 有明确的版本门槛和模块要求。
错误信息如 “onShareAppMessage is not a function” 或点击无反应,基本可锁定为这两类配置缺失。
- 确认项目
manifest.json中已启用 share 模块:"mp-weixin": { "usingComponents": true, "permission": { "scope.userLocation": { "desc": "用于获取位置" } }, "requiredBackgroundModes": ["audio"], "share": { "enabled": true } } - 基础库版本必须 ≥ 2.27.0,可在开发者工具「详情」→「项目配置」里查看,低于此版本会静默忽略分享钩子
- H5 端不支持
onShareAppMessage,若需兼容,必须在页面中判断平台:uni.getSystemInfoSync().platform === 'mp-weixin'


















