使用 Apollo 链路状态缓存实现客户端过滤

Posted

技术标签:

【中文标题】使用 Apollo 链路状态缓存实现客户端过滤【英文标题】:Implementing client side filtering with Apollo link state cache 【发布时间】:2019-02-15 16:28:24 【问题描述】:

是否可以查询 Apollo 客户端缓存以获取客户端上过滤数据的列表?

客户端从graphql服务器获取数据后,可以从Apollo开发工具中看到数据在本地缓存中。

如何在不访问服务器的情况下获得与一组“标签”匹配的“项目”类型列表?

type Item 
 id: ID
 text: String
 tags: [String]

我认为这对于 Apollo-link-state 自定义解析器是可行的,但到目前为止还无法找出它的策略或在网上的任何地方找到示例。

我知道 Apollo 缓存了已经执行的查询的数据,并且可以使用 ID 和 .readFragment 访问它,但是如果数据已经存在于客户端缓存中,应该可以获得一个列表特定条件的数据?

更新:

具体要求如下

    从服务器获取前 100 个 getItem 结果 用户在客户端通过一些标签过滤结果 显示已提取的 100 条记录中的过滤项目 从服务器获取更多记录以匹配过滤条件,以填充页面的其余部分,最多 100 个项目。 允许根据过滤条件进行分页。

随着使用量的增加,我们将缓存中的大部分项目,为大部分数据提供即时过滤体验。

确切的问题是我们是否可以使用 .readFragment 或 .readQuery 访问原始记录列表并在客户端动态过滤(如果可以的话/示例)?或者有其他的方式来看待这个?

【问题讨论】:

【参考方案1】:

这种功能可以使用apollo-link-state来实现。

example - 'internal' 查询可以被fetchPolicy 强制为cache-only

还可以考虑在组件状态中进行简单过滤(或other options - 这完全取决于(共享过滤结果)要求。

【讨论】:

感谢您的回答,我应该更清楚确切的用法。我已经更新了上面的问题。如果你能看看就太好了! 实际上,尝试 IRL,“缓存优先”获取策略提供几乎相同的体验。谢谢!

以上是关于使用 Apollo 链路状态缓存实现客户端过滤的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 链接状态与内置 React 状态

[技术干货] 利用traceroute命令监控主备链路状态

写入缓存时,Apollo 客户端链接状态“ 中缺少字段”?

Apollo-boost 缓存问题

链路电源管理中的 L2 状态

刷新页面时,apollo-state-link 不在缓存中保存状态