背景:公司有好几款小程序,我负责的一款是论坛类的,其他小程序需要接入我的小程序。 我的小程序提供了论坛帖子详情页供其他小程序直接进入,传入帖子id即可 eg. wx.navigateToMiniProgram({ appId: 'xxxx', // 固定传参 path: 'pages/public/bbs-post-detail?id=123', envVersion: 'develop', // 'develop开发版 trial体验版 release正式版' extraData: { }, success(res) { // 打开成功 } }) 然后我的bbs-post-detail页面,在onShow里去接传入的参数。 至于为什么要在onShow里接呢,是因为onLoad只调用一次,如果用户先打开了论坛小程序,并且进入了帖子详情,那么从别的小程序跳转过来进帖子详情,就不会显示想要显示的帖子了。 所以一开始我的逻辑是,在onLoad中读取内部页面传参的options,并且获取帖子详情,在onShow里使用wx.getEnterOptionsSync()去获取别的小程序传过来的参数,并且判断进入场景是1037,就使用onShow获取到的id获取帖子详情。 本来一切都很正常,直到有一天发现有人触发了列表点击所有帖子进入详情都是同一篇帖子。 于是debug,于是发现: 小程序在onHide的时候,会将页面onLoad时的参数放入全局的options中 猜测小程序这么干,是为了你下次再打开小程序时,依然还是跟你离开时的状态一样。 但是他并不会清除掉scene的值,并且,如果在帖子详情页调起分享的联系人界面,就会调用小程序或者页面的onHide(没有具体测是哪一个的onHide)。所以问题就来了,我详情页的onShow里面,能读到scene===1037并且能读取到有帖子id。 所以只要用户是从别的小程序来的,并且在详情页调用分享的联系人界面,那么这个用户每次从列表进详情页,都会走onShow的逻辑,取那个固定的帖子id。 解决方案: 在内部页面跳转中,加上一个from参数,用来标记是页面内部跳转进的详情页,并且在详情页的onShow里面判断如果有from并且是内部传的from,就不去wx.getEnterOptionsSync()了。搞定。