uni.removestorage 和 uni.removestoragesync 需先校验 key 是否存在、严格匹配大小写,禁用原生 localstorage.removeitem,否则跨端失效;android 低版本删不存在 key 会报错,须用 uni.getstoragesync(key) !== undefined 预判;同步版需 try/catch,异步版须处理 fail 回调;登出时还需清理 localstorage/sessionstorage 及原生缓存。
直接用 uni.removestorage 或 uni.removestoragesync,但必须先确认 key 存在、大小写严格匹配,且不能混用原生 localstorage.removeitem —— 否则跨端失效。
为什么 uni.removeStorage({key: 'token'}) 有时没反应
常见错误是 key 不存在或拼写不一致:uni-app 对 key 大小写敏感,'Token' 和 'token' 是两个键;另外 Android 低版本在删不存在的 key 时会直接报错,而不是静默忽略。
- 删之前务必检查:
uni.getStorageSync('token') !== undefined - 避免硬编码字符串,建议把关键 key 提取为常量,比如
const TOKEN_KEY = 'auth_token' - 异步调用时别漏掉
fail回调,尤其登出流程中失败可能导致页面卡在登录态
removeStorageSync 和 removeStorage 怎么选
同步版适合逻辑简单、数据量小、不需要后续依赖结果的场景(如清一个 token 后立即跳转);异步版必须用在需要确认删除成功再执行下一步的地方(比如删完 userInfo 再 reLaunch 到登录页)。
- 同步调用无回调,失败会抛异常,需包
try/catch:try { uni.removeStorageSync('refreshToken') } catch(e) { console.error(e) } - 异步调用支持
success/fail,但注意 success 不代表“数据已落地”,只是“写入请求已发出” - 不要在循环里大量用同步删除,可能阻塞 UI;批量删多个 key 时优先用异步 + Promise.all,但需控制并发数(尤其 App 端)
H5 端删了 uni.removeStorage 还剩数据?
因为你在其他地方手动用了 localStorage.setItem,而 uni.removeStorage 只管自己写入的 key。uni-app 的 H5 底层确实是 localStorage,但它加了一层 key 命名空间隔离(比如自动加前缀),你手写的 key 它根本看不见。
- 搜索项目里所有
localStorage.和sessionStorage.调用点,补上对应清理逻辑 - 登出时若需彻底清空,得额外加:
localStorage.clear()和sessionStorage.clear() - 如果用了 PWA 或 Service Worker,
caches.delete()是另一套,uni API 完全不感知
App 和小程序端的隐藏坑
uni.removeStorage 在 App 和小程序端行为一致,但文件类缓存、图片缓存、网络请求缓存完全不在此范围内 —— 它们各自有独立 API,且大多需要条件编译。
- 删图片缓存?App 端要加
#ifdef APP-PLUS包裹plus.cache.clear()或uni.clearImageCache() - 删下载的文件?必须先
uni.getSavedFileList()拿路径列表,再逐个传filePath给uni.removeSavedFile() - 小程序端无法清理 wx.downloadFile 的临时文件,只能等系统自动回收,或改用
uni.downloadFile并手动uni.saveFile后管理
最易被忽略的一点:删 key 不等于重置页面状态。组件 data、ref、Pinia store 里的数据完全不受影响,该清的还得在 onHide/onUnload 里手动重置。











