使用Apollo React客户端,为什么不总是需要一个解析器来解析@client GraphQL查询?

时间:2019-05-02 12:13:03

标签: reactjs graphql react-apollo apollo-client

我正在学习如何将Apollo Client for React以及如何使用缓存管理本地状态。从docs来说,就像使用cache.writeData写入缓存并使用简单查询从缓存中读取一样简单。他们的例子是

const GET_VISIBILITY_FILTER = gql`
  {
    visibilityFilter @client
  }
`;

然后,我将JSX包装在一个查询中,并且可以读取值很好(在我的情况下为loggedIn

 return <Query query={GET_LOGGED_IN}>
      {({loading, error, data}) => {

        const {loggedIn} = data

我很好奇,为什么我不需要编写一个解析器就可以工作。是因为使用标量值,如果值存在于对象的根(即在缓存的最高层),则Apollo / GraphQL会自动获取该值并将其发送给您,而无需使用解析程序?

这有什么限制,也就是说,您可以在不编写解析器的情况下在根级别获取数组吗?对象?我假设不是as these don't seem to be scalars。但是,如果数据是硬编码的,即不需要任何数据库查找,答案是否定的?

2 个答案:

答案 0 :(得分:2)

来自the docs

  

[@ client指令]告诉Apollo Client在本地(从缓存或使用本地解析器)获取字段数据,而不是将其发送到我们的GraphQL服务器。

如果该指令存在于字段中,则Apollo将尝试使用提供的解析程序来解析该字段,如果不存在,则回退到直接从缓存中获取。您可以在根级别使用几乎任何种类的数据初始化缓存(注意为对象包括__typename字段),并且应该能够获取它,而不必同时提供resolver它。另一方面,提供解析程序可以使您对从缓存中实际获取的内容进行更细粒度的控制-即,您可以使用一系列项目初始化缓存,但是可以使用解析程序提供对它们进行过滤或排序的方法。

这里有一个导入方面的细微差别:在没有解析器的情况下进行抓取,仅当缓存中有要抓取的数据时才起作用。这就是在构建客户时为这些字段提供初始状态很重要的原因。如果您有一个嵌套更深的@client字段(例如,也许您在从服务器获取的数据旁边包含其他信息),那么从技术上讲,您也不必编写解析器。但是我们通常会编写它们,因为这些嵌套字段的缓存中没有现有数据。

答案 1 :(得分:1)

除了丹尼尔(通常)的出色回答外,我想补充几句话。

您可以使用(读/写)对象直接缓存和操纵其属性。

使用解析器和本地数据突变可以帮助提高可读性,数据访问/更改统一性,总体可管理性或将来的更改(将功能/设置移动到服务器)。

您可以在apollo-universal-starter-kit项目中找到关于地方政府管理的更多实用/高级示例。