Apollo中如何清除带有@Connection指令的查询缓存?
Apollo中如何清除带有@Connection指令的查询缓存?
嘿,我完全懂你遇到的困扰——用@Connection标记的查询缓存,直接拿key去evict根本不管用对吧?我之前也踩过这个坑,来给你说说正确的操作方式!
首先得搞明白为什么你原来的方法不行:你试图清除ROOT_QUERY下的eventsList字段,但实际上eventsList并不是挂在ROOT_QUERY上的!你的查询是嵌套在me字段里的,@Connection(key: "eventsList")是给me对象下的events字段指定了缓存键,所以这个缓存条目是属于me对应的用户对象的,不是根查询。
那正确的步骤应该是这样的:
1. 获取me对象的缓存ID
要操作用户对象的缓存,首先得拿到它的唯一标识ID。你可以通过readQuery先读取当前用户的基本信息,再用cache.identify生成ID:
const clearCache = (): void => { // 先读取当前用户的id和__typename const meQueryResult = client.cache.readQuery({ query: gql`query GetMeId { me { id __typename } }` }); if (!meQueryResult?.me) return; // 生成用户对象的缓存ID const meCacheId = client.cache.identify(meQueryResult.me);
2. 清除指定的缓存字段
@Connection(key: "eventsList")会给events字段生成一个带key的缓存字段名,格式是${原字段名}:${key},也就是这里的events:eventsList。接下来用这个字段名和用户缓存ID去evict:
// 清除用户对象下的events:eventsList缓存 client.cache.evict({ id: meCacheId, fieldName: 'events:eventsList', }); // 清理失效的缓存条目 client.cache.gc(); };
补充说明
- 如果你不确定缓存里的字段名到底是什么,可以用Apollo DevTools查看缓存结构,找到用户对象下对应的字段,就能看到
@Connection生成的完整字段名了。 - 要是你的
@Connection还结合了变量,可能需要额外传入args参数,但如果只是用key固定缓存键,上面的方法就足够了。
这样操作之后,带有@Connection(key: "eventsList")的events字段缓存就会被精准清除啦!
备注:内容来源于stack exchange,提问作者Sven van Zoelen
相关产品推荐
相关产品推荐

