h5返回数据不刷新是因为onload不触发,应将数据加载逻辑移至onshow并加时间戳防重复请求;需封装safenavigateback兼容history.back();用isfirstload区分首次加载与返回场景;vuex/pinia状态恢复须在onshow中手动触发。

uni.navigateBack()在H5返回时数据不刷新?onShow必须介入
页面返回后列表还是旧的、订单状态没更新、用户操作没生效——这不是接口没调,而是你把数据加载逻辑全塞在onLoad里了。H5返回不会触发onLoad,只触发onShow。
-
onLoad只在首次进入页面时执行一次,刷新或返回都不再触发 -
onShow每次页面“可见”都会执行,包括从详情页返回列表页、切后台再切回来、甚至浏览器标签页重新聚焦 - 直接把
loadData()挪到onShow里最简单,但可能引发重复请求 - 推荐加时间戳判断:比如30秒内不重复拉取,用
this.lastFetchTime和Date.now()比对
第三方回调(如人脸核身)导致刷新后返回失效?用history.back()兜底
腾讯云/支付宝人脸核身后强制刷新页面,getCurrentPages()只剩1个,uni.navigateBack()静默失败。这时候不能硬扛,得切换到浏览器原生历史栈。
- 封装一个
safeNavigateBack函数,优先调uni.navigateBack,栈空时自动降级为history.go(-1) - 别在
onUnload里存栈——H5刷新时这个生命周期根本不触发 -
history.back()有风险:可能跳到第三方页面(比如核身后回调页),上线前务必用真实路径链路实测 - 所有自定义返回按钮、左上角图标、物理返回键监听,都必须走这个封装函数,不能漏
返回后选中状态重置(如切换届次后回到列表页变回“本届”)?区分首次加载与返回场景
问题不是数据丢了,是onShow里又执行了一次初始化逻辑,把用户之前选的selectedTerm覆盖成默认值。
- 用
isFirstLoad标志位控制:首次进页面才执行完整初始化;返回时只做必要刷新(比如检查登录态、更新时间戳) - 避免在
onShow里无条件重置ref或data字段,尤其涉及用户交互状态的变量 - 如果状态较复杂(如表单草稿、筛选条件),可配合
localStorage临时存取,但注意及时清理,避免跨用户污染
H5刷新后Vuex/Pinia状态清空?持久化插件必须配+手动恢复时机
刷新后Vuex里的userInfo变成null,不是插件没起作用,而是你没在App.vue的onShow里主动触发恢复逻辑。
-
vuex-persistedstate或pinia-plugin-persistedstate只负责存,不负责取——存进去容易,取出来要用 -
onLaunch只管首次启动,onShow才是刷新后的救命稻草,两者都要调store.restore()或等效逻辑 - Token类敏感数据别只存在Vuex里,得同步注入到
uni.addInterceptor的请求头,否则即使状态恢复了,后续请求仍401 - 不要在
main.js里读uni.getStorageSync——H5端此时uniAPI还没就绪,会undefined
onShow里混用初始化和状态恢复逻辑,以及以为“用了持久化插件就万事大吉”。刷新不是丢数据,是丢上下文;而H5的上下文重建,必须靠开发者手动缝合。











