uni-app 无页面缓存概念,页面数据残留源于Vue实例未销毁、data未重置或数据存于Storage/全局状态;onUnload不总触发,需用onHide/onShow手动重置;uni.clearStorageSync仅清存储,不影响组件data;彻底销毁需reLaunch或主动navigateBack;混用wx/uni存储需分别清理。

uni-app 没有“页面缓存”这个概念,所谓“页面数据残留”本质是 Vue 实例未销毁、data 未重置、或数据被存在了 Storage / 全局状态里 —— 直接调 uni.clearStorageSync() 或刷新页面根本解决不了问题。
页面返回时 data 还在?onUnload 不一定触发
很多人以为从 B 页面 navigateBack 回 A,A 的 onUnload 就会执行。但实际只有 A 被真正销毁(比如被栈顶新页面完全覆盖、或手动 reLaunch)才会触发。多数跳转场景下 A 只是 onHide,data 完全保留。
- 用
onHide+onShow配合重置:适合表单页、搜索页等需要“每次进入都清空”的场景 - 在
onShow里手动重置关键字段,比如this.searchKeyword = ''、this.list = [] - 避免在
onLoad里直接读取上一页传参并赋值给data,改用计算属性或临时变量,防止污染原始data - 如果用了 Vuex / Pinia,记得在
onUnload或onHide主动commit('resetState'),否则状态永远挂着
uni.removeStorageSync 不等于清页面,它只管 Storage
uni.removeStorageSync('user_info') 或 uni.clearStorageSync() 只影响通过 uni.setStorage 存的数据,和页面组件的 data、computed、ref 完全无关。
- 你
uni.setStorage({ key: 'token', data: 'xxx' }),登出时清掉是对的;但页面里this.formData = { name: '张三' }不受影响 - 误用
uni.clearStorageSync()清页面,反而可能把用户刚填一半的表单、AB 测试分组 ID(存在localStorage)也一并干掉 - H5 端尤其要注意:
uni.setStorage底层就是localStorage.setItem,但反过来,你手动用localStorage.setItem('trace_id', 'xxx')存的,uni.clearStorageSync()根本不认
真要销毁页面实例?别靠“清缓存”,得控制路由行为
Vue 组件销毁取决于 uni-app 的页面栈管理。想让页面彻底销毁(释放内存、触发 beforeDestroy),必须让它退出栈 —— 不是“返回”,而是“替换”或“重载”。
- 用
uni.reLaunch({ url: '/pages/home/home' })替换整个栈,原页面实例会被销毁 - 用
uni.redirectTo({ url: '/pages/list/list' })替换当前页,上一页仍保留在栈中但不可见;若需连带销毁上一页,得在上一页主动uni.navigateBack({ delta: 1 })后再redirectTo - 组件级销毁:如果页面内嵌了自定义 Picker、Map 等重型组件,在
onHide中调this.$refs.picker && this.$refs.picker.destroy()(前提是组件暴露了 destroy 方法) - 定时器、事件监听器必须手动清理,否则即使页面隐藏,回调仍在执行 —— 在
onHide清clearTimeout,在onUnload解绑uni.onSocketMessage等全局监听
小程序端特别容易踩的坑:wx.setStorageSync 和 uni 不互通
微信小程序里,如果你混用了 wx.setStorageSync 和 uni.setStorage,它们写入的是两套隔离的存储空间。
-
uni.setStorage({ key: 'a' })写入后,wx.getStorageSync('a')读不到;反之亦然 - 所以“清缓存”时不能只清
uni的,还得检查是否用了wx.系列 API 存了关键数据(比如登录态、设备指纹) - 上线前 grep 项目里所有
wx.setStorage、localStorage.、sessionStorage.,逐个确认清除逻辑 - 小程序调试时可用
console.log(wx.getStorageInfoSync())和console.log(uni.getStorageInfoSync())对比 keys 差异
最麻烦的不是“怎么清”,而是“清哪里”——Storage、文件、Webview 缓存、PWA cacheStorage、甚至安卓 ROM 自定义缓存路径,每层都得单独处理。上线前务必在真机上逐平台验证,别信模拟器。











