我正在与Apollo Client local state and cache合作,虽然我已经看过了文档(https://www.apollographql.com/docs/react/essentials/local-state),一些教程(例如,https://www.robinwieruch.de/react-apollo-link-state-tutorial/)看看一些例子,我有点困惑。除了您可以提供以下特定问题的任何见解之外,如果您可以链接到其他好的文档/资源,以便将事情置于上下文中,我们将不胜感激。
特别是,我了解如何存储本地客户端数据并进行检索,但我不知道这些数据是如何与从服务器检索并发送回服务器的数据集成的。
以简单的“待办事项应用程序”为起点,我有几个问题。
1)如果您使用查询从服务器下载一组数据(在本例中为“待办事项”),缓存的数据和服务器端数据之间的关系是什么?也就是说,我通过查询获取数据,它会自动存储在缓存中。现在,如果我想在本地获取该数据,并且,比如说,修改它(在本例中,添加待办事项或修改它),我该如何做到这一点?我知道如何对我创建的数据进行操作,但不知道如何对我下载的数据进行操作,例如,在本例中,我的待办事项集。例如,一些教程引用了__typename
——对于从服务器下载的数据,这个__typename
是什么?如果我使用readQuery
来获取从服务器下载并存储在缓存中的数据,我将使用什么查询?与我最初下载数据时使用的相同?
2) 一旦我修改了这个本地数据(例如,在todo的情况下,将一个todo设置为“已完成”),并使用writeData将其写回缓存,如何将其发送回服务器,以便本地副本和远程副本同步?有突变?所以我负责将副本存储到本地缓存,并在两个单独的操作中将其发送到服务器?
3) 据我所知,除非您另有规定,否则如果您从Apollo客户端进行查询,它将首先检查您请求的数据是否在缓存中,否则它将调用服务器。那么,为什么您需要在示例代码中创建一个客户机来掌握TODO呢?因为这些数据不是通过先前的查询从服务器下载的,而是本地数据?
const GET_TODOS = gql`
{
todos @client {
id
completed
text
}
visibilityFilter @client
}
`;
如果它们实际上是通过早期查询下载的,您不能使用最初用于从服务器获取数据的相同查询,而不是放置@Client
,并且如果数据在缓存中,你会得到缓存的数据吗?
4) 最后,我读到Apollo客户端将自动更新内容——也就是说,如果您将修改后的数据发送到服务器(例如,在我们的例子中,是修改后的todo),Apollo客户端将确保该数据段在缓存中被修改,并按ID引用。关于何时修改和何时不修改,是否有任何规则?如果Apollo客户端使用IDs与服务器保持同步,我们什么时候需要像上面那样“手动”处理,什么时候不需要?
感谢您提供的任何见解,如果您有指向上述文档以外的其他文档的链接,或者有一个好的教程,我将不胜感激
>
__typename
是Apollo内置的自动魔术方式,用于跟踪和缓存查询结果。默认情况下,您可以使用项目的__typename
和id
来查找缓存中的项目。您通常不需要担心__typename
,直到您手动需要调整缓存。在大多数情况下,只需在原始请求之后重新运行服务器查询以从缓存中提取。服务器响应默认缓存,因此下次您运行查询时,它会从缓存中提取。
这取决于您的情况,但大多数情况下,如果您正确设置ID,Apollo客户端会自动同步来自突变的更改。您需要做的就是返回id
属性和突变查询中任何更改的字段,Apollo将自动神奇地更新缓存。因此,如果您描述将待办事项标记为已完成的情况,您可能应该将突变发送到服务器,然后在突变响应中请求已完成的字段和id。客户端将自动更新。
您可以使用原始查询。Apollo客户端基本上使用查询变量缓存内容-
请参阅我对上面#2的回答,但只要您在突变中包含id
和任何修改过的数据,Apollo客户端就会为您处理它。如果您添加新数据,例如将待办事项添加到列表中,它不会为您处理它。删除数据也是如此。
我需要一些帮助来理解为什么在Eureka注册的服务会想要彼此通信,尽管没有实际运行。例如,我在尤里卡注册了服务A和服务B。如果我搞垮了服务B,那么即使服务A没有运行,它仍然会尝试与服务B进行30秒到3分钟的通信。这样做的目的是什么?有什么办法可以绕过它吗?谢谢你!
反应阿波罗客户端应用程序。我试图使用readQuery从缓存中读取数据,但无法读取缓存字段。 这里有一个纲要: 组件调用,它执行我的查询并缓存结果。查询返回类型。一切都很好,开发工具显示包含一个名为getPost的字段和该帖子。 有一个子组件,它会在单击时删除评论。它调用并删除评论。查询返回类型。 Post有一个注释数组,现在我需要在缓存中更新它的数组并删除已删除的注释。我使用突变中的函数来获取缓
我使用Apollo 2.0管理graphQL API调用,并处理react应用程序的全局状态。 我试图创建一个登录屏幕,用户在其中输入用户名和密码,这将发送到我的API进行身份验证,成功后,我想将isLoggedIn的全局状态设置为true。 到目前为止,我能够使用一个使用客户声明的突变来设置全局状态,因此它只与局部状态有关。我有另一个变种,它进行graphQL API调用,验证用户名/密码,然后
我想知道以下问题的答案: 1)如果Ignite服务器重新启动,我需要重新启动客户端(web应用程序)。是否有任何方法可以在服务器重新启动时重新连接到服务器。我知道当服务器重新启动时,它分配了一个不同的ID,因此当前现有的连接变得过时。是否有方法克服这个问题,如果是的话,哪一个版本的Ignite支持这个功能。目前我使用1.7版本 3)如果我有一个大对象要缓存,我发现序列化和反序列化在Ignite中需
我创建了一个由Apollo客户端和graphQL驱动的react应用程序 定义了我的架构,因此预期结果是一个对象数组(<代码>[{名称:“metric 1”,类型:“type A”},{名称:“metric 2”,类型:“type B”})]) 在jsx文件中,我定义了以下查询: 我用Apollo HOC包装了组件,如下所示: Apollo客户端工作正常,并在渲染方法中返回道具的预期列表。 我想让
我有一个例子,其中我有一个,它在graphql中定义了不同的实现。我可能无法共享确切的代码。但情况似乎是这样的: 有一个查询返回或类型作为响应。 响应可能包含以下内容: 或 我在客户端使用Apollo Client 3来查询数据,并有如下片段: 我查询的数据为: 由于这是的情况,正如Apollo client 3文档中所定义的,我们需要使用,以便在这种情况下匹配片段。出于缓存目的,我在Memory