推荐使用Pinia实现API数据缓存:按业务域建独立store,生成含业务标识与分页参数的结构化缓存键,将读写逻辑封装进action,并配合ref哨兵实现页面级缓存控制。

直接用状态管理工具缓存 API 数据是可行的,但关键在于“怎么存、何时用、怎么更新”。单纯把响应结果塞进 store 并不等于有效缓存——容易过期、难追踪、跨页面失效。核心是要让缓存行为与业务上下文对齐,而不是堆数据。
选对状态管理工具:Pinia 比 Vuex 更适合现代缓存场景
Vue 3 项目推荐用 Pinia。它原生支持组合式 API、类型推导友好,且模块化天然适配“按业务域缓存”的思路。比如招聘系统中,“船舶列表”“职位详情”“候选人分页数据”可各自独立建 store,互不影响:
- 每个 store 只管自己那块数据的生命周期(加载、缓存、失效)
- 通过 state + getters + actions 封装完整缓存逻辑,而非裸露数据
- 避免 Vuex 中 mutations 的同步限制,Pinia actions 可自然处理异步请求和缓存写入
设计带上下文的缓存键:别只用 URL 做 key
缓存失效常因 key 太简单。例如 /api/candidates?ship=123&page=1 和 /api/candidates?ship=123&page=2 是两个不同请求,但若只用接口路径作 key,就会互相覆盖。
推荐生成结构化缓存键:
立即学习“前端免费学习笔记(深入)”;
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
-
包含业务标识:如
shipId、jobCategoryId -
包含分页参数:
page和size必须参与 key 构建 - 可选加入时间戳或版本号:用于强制刷新某类数据(如配置类接口)
示例函数:
const generateCacheKey = (shipId: string, category: string, page: number, size: number) =>`candidates_${shipId}_${category}_p${page}_s${size}`;
在 action 中统一控制缓存读写逻辑
不要在组件里手动判断“有没有缓存”,而是把判断、请求、写入封装进 store 的 action:
- 调用
loadCandidates({ shipId, category, page, size })时,先查本地 state 是否已有对应 key 的数据且未过期 - 有则直接 resolve;无则发请求,成功后写入 state 并触发响应式更新
- 提供
invalidateCandidates(shipId?)方法,支持按条件清除缓存(如切换船舶时清空全部)
这样组件只需关心“我要什么数据”,不操心“从哪来”。
配合响应式变量做页面级缓存哨兵
对于单页内频繁切换但数据不变的场景(如 Tab 切换职位列表),可用 ref 做轻量哨兵:
- 定义
const cachedPageId = ref<string>('')</string>记录当前激活的页面上下文 - 当用户切换到新职位页时,比对
cachedPageId.value是否匹配,不匹配则清空当前缓存并更新哨兵 - 比全局 store 更快、更局部,适合高频小范围缓存控制

















