如何协调Apollo缓存策略与React组件开发模式的适配问题
Apollo缓存与React组件化风格适配方案
- 首先澄清一个常见误解:Apollo 3.0及以上版本已经原生支持基于
__typename的缓存失效能力,无需感知其他组件的查询逻辑。当你执行变更操作需要批量失效某类数据时,直接在update回调中调用缓存的evict方法即可,示例如下:
该操作会自动清除所有该类型的缓存条目,后续依赖该类数据的组件重新渲染时会自动请求最新数据,不需要导入任何其他组件的查询语句,也不会产生组件间的直接耦合。update(cache) { // 失效所有类型为Article的缓存数据 cache.evict({ typeName: 'Article' }) // 可选:执行垃圾回收清除悬空引用 cache.gc() } - 大部分场景下不需要手动操作缓存:只要你的变更接口返回了修改后实体的完整
id+__typename,Apollo Client会自动更新所有引用了该实体的查询缓存,不需要额外写refetchQueries或者update逻辑。 - 如果你需要类似react-query的前缀匹配失效能力,可以通过自定义缓存规则轻松实现:
- 初始化Apollo Client时在
typePolicies中为指定查询配置统一的缓存键前缀 - 失效时调用
cache.keys({ prefix: '自定义前缀' })获取所有匹配的缓存键,批量调用evict清除即可
- 初始化Apollo Client时在
- 组件解耦最佳实践:把变更操作和对应的缓存失效逻辑封装为独立的自定义Hook,比如
useCreateOrder、useUpdateUser,业务组件只需要调用对应Hook即可,不需要感知任何缓存逻辑,也不会和其他同级组件产生依赖。
内容的提问来源于stack exchange,提问作者Friedrich
相关产品推荐
相关产品推荐

