本地搜索缓存的核心是“先查后请求”,即输入时优先查 Map 缓存,命中则直接更新响应式结果列表,未命中再防抖发起接口并写入缓存;需配合时效控制、事件清理与 LRU 容量管理。

本地搜索缓存的核心思路是:用户输入时暂不发请求,先查本地已有数据;命中则直接渲染,未命中再触发接口,并将结果存入缓存供后续复用。关键不在“响应式状态”本身,而在于如何把搜索行为、缓存策略和状态更新三者串起来。
用 Map 或对象结构管理关键词缓存
避免每次搜索都走接口,最直接的方式是把“关键词 → 结果列表”映射关系存起来。Map 比普通对象更合适,支持任意类型 key(比如带分页参数的对象),也方便清理过期项。
- 初始化一个 ref 或 useState 存 Map 实例,例如:const searchCache = ref(new Map())
- 搜索前先检查 searchCache.value.has(keyword),有就直接赋值给展示列表
- 接口返回后,执行 searchCache.value.set(keyword, result),下次同词搜索秒出
防抖 + 缓存双重拦截,避免无效请求
用户连续输入时,高频触发搜索会浪费资源。必须加防抖,且防抖逻辑要和缓存判断配合——不是“防抖完才查缓存”,而是“每次输入都先查缓存,命中就取消本次防抖请求”。
- 用 setTimeout 或 useDebounce(如 VueUse)控制请求时机
- 在防抖回调里,先检查缓存;若命中,clearTimeout 当前定时器并直接更新 UI
- 仅当缓存未命中时,才真正发起接口,并在成功后写入缓存
缓存需设有效期或手动刷新机制
静态缓存容易导致数据陈旧。尤其搜索结果可能随后台变更,不能永久保存。建议按场景选择策略:
- 时间驱动:存缓存时记录时间戳,读取前判断是否超时(如 5 分钟),超时则忽略缓存
- 事件驱动:在新增/编辑/删除等操作后,清空相关关键词缓存(例如删了某条商品,就 searchCache.value.delete('手机'))
- 容量控制:缓存条目过多时,用 LRU 策略自动淘汰冷数据(可用 lru-cache 库简化实现)
结合响应式状态做精准更新
缓存只是存储,最终要反映到界面上。别直接改原始数组,要用响应式方式通知视图更新:
- 搜索结果变量用 ref([]) 或 useState([]) 声明,确保变化可追踪
- 从缓存读取后,用 results.value = cachedData(Vue)或 setResults(cachedData)(React)触发更新
- 加载状态(loading)、错误信息(error)也要配套响应式管理,避免缓存命中时 loading 还在转圈










