首页 文章

删除给定查询和每组变量的Apollo Client缓存

提问于
浏览
8

我有一个基于 getAllItems 查询的过滤项目列表,它将过滤器和一个order by选项作为参数 .

创建新项目后,我想删除此查询的缓存,无论传递什么变量 . 我不知道该怎么做 .

我不认为更新缓存是一种选择 . 所有在Apollo客户端文档(Updating the cache after a mutationrefetchQueries and update)中提到的方法似乎都需要一组给定的变量,但由于过滤器是一个复杂的对象(带有一些文本信息),我需要为每个给定的变量集更新缓存 . 以前提交过 . 我不知道该怎么做 . 另外,只有服务器确实知道这个新项目如何影响分页和排序 .

我不认为fetch-policy(例如将其设置为 cache-and-network )就是我只是过滤列表(键入要搜索的字符串),我想保持默认行为( cache-only ) .

client.resetStore 会为所有类型的查询重置商店(不仅仅是 getAllItems 查询),所以我也不知道我正在寻找什么 .

我很确定我在这里遗漏了一些东西 .

1 回答

  • 0

    在当前版本的Apollo中没有官方支持的方法,但有一个解决方法 .

    在更新功能中,创建项目后,您可以遍历缓存并删除密钥以您尝试从缓存中删除的类型名称开始的所有节点 . 例如

    // Loop through all the data in our cache
    // And delete any items where the key start with "Item"
    // This empties the cache of all of our items and 
    // forces a refetch of the data only when it is next requested.
    Object.keys(cache.data.data).forEach(key => 
      key.match(/^Item/) && cache.data.delete(key)
    )
    

    这适用于在具有不同变量的高速缓存中存在多次的查询,即分页查询 .

    我写了一篇关于Medium的文章,详细介绍了它的工作方式以及一个实现示例和替代解决方案,它更复杂但在少数用例中效果更好 . 由于本文详细介绍了我在本回答中已经解释过的概念,我相信可以在此分享:https://medium.com/@martinseanhunt/how-to-invalidate-cached-data-in-apollo-and-handle-updating-paginated-queries-379e4b9e4698

相关问题