GraphQL:Apollo 客户端缓存如何工作以保持与服务器的数据一致性?

Posted

技术标签:

【中文标题】GraphQL:Apollo 客户端缓存如何工作以保持与服务器的数据一致性?【英文标题】:GraphQL: how does Apollo client caching work to keep data consistency with the server? 【发布时间】:2020-09-10 03:36:15 【问题描述】:

我正在使用 apollo-clientapollo-cache-inmemory

假设我有 2 个页面:Item List 页面和 Item Detail 页面。

项目列表页面显示(通过使用client.query(...)获取数据:

项目 A B 项 C 项

当导航到项目 B 的 项目详细信息 页面时,我使用涉及store.readQuerystore.writeQuery 的变异技术对项目 B 进行了变异:https://www.apollographql.com/docs/react/caching/cache-interaction/#updating-after-a-mutation

现在,在导航回 Item List 页面之前,假设我的应用的另一个用户对 Item A 进行了突变。

我的问题:

    当我导航回项目列表页面时,我是从缓存中获取数据还是从服务器获取数据client.query(...) 是否总是从服务器获取数据? ????

    如果我从缓存中获取数据,如何保持与服务器的数据一致性? (目标是始终在列表中显示更新的项目,例如项目 A - 在优化缓存的同时与服务器同步)

【问题讨论】:

【参考方案1】:

如果您想保持数据同步,即使它被其他用户更改,您需要始终从服务器获取或在服务器和客户端上实现订阅。这样,您就可以在数据更改时推送新事件,并让客户端订阅这些更改以实时更新缓存。

【讨论】:

啊,对了,现在越来越清楚了。但是client.query调用是否总是默认从服务器获取数据? 可以使用fetchPolicy 选项在每个查询的基础上修改客户端的行为。 cache-first 是默认值。 非常感谢。我现在明白了。 ??

以上是关于GraphQL:Apollo 客户端缓存如何工作以保持与服务器的数据一致性?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL 客户端不会在查询中返回缓存的嵌套类型

如何在突变之前更新 apollo 缓存状态,以进行 Like、Upvote 等操作? [关闭]

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

作为道具传递与提取缓存 Apollo 客户端 Nextjs

GraphQL/Apollo 客户端:如果查询是先前查询的子集,则从缓存中获取数据

ReactJS:Apollo graphql 客户端。缓存不在本地更新