首页 文章

使用尚不存在的查询从apollo缓存中读取查询,但已将所有信息存储在缓存中

提问于
浏览
0

我有一个graphql endpoints ,可以输入此查询:

fragment ChildParts {
  id
  __typename
}

fragment ParentParts {
  __typename
  id
    children {
   edges{
       node {
         ...ChildParts 
       }
   }
}

query {
  parents {
    edges
      nodes {
        ...ParentParts
      }
    }
  }
}

执行时,它返回如下内容:

"data": {
  "edges": [
     "node": {
       "id": "<some id for parent>",
       "__typename": "ParentNode",
       "children": {
         "edges": [
           node: {
             "id": "<some id for child>",
             "__typename": "ChildNode"
           },
           ...
         ]
       }
     },
     ...   
  ]
}

现在,使用apollo客户端,在发生变异后,我可以从缓存中读取此查询,并更新/添加/删除任何ParentNode,以及任何ChildNode,但我必须检查此查询返回的结构 .

现在,我正在寻找从缓存中获取ChildNodes列表的可能性(由于缓存被创建为平面列表,因此已经具有这些列表),以使嵌套数据的更新更容易一些 . 是否有可能从缓存中读取查询,而无需从服务器读取相同的查询?

1 回答

  • 1

    您可以使用客户端的 readFragment 方法从缓存中检索任何一个单独的项目 . 这只需要id和片段字符串 .

    const todo = client.readFragment({
      id,
      fragment: gql`
        fragment fooFragment on Foo {
          id
          bar
          qax
        }
      `,
    })
    

    注意 id 这里是dataIdFromObject函数返回的缓存键 - 如果你还没有指定自定义函数,那么(如果存在__typename和id或_id字段),默认实现只是:

    ${result.__typename}:${result.id || result._id}
    

    如果您提供了自己的dataIdFromObject函数,则需要提供该函数返回的任何id .

    正如@Herku指出的那样,根据用例,还可以使用缓存重定向来解析在解析另一个查询时为一个查询缓存的数据 . 这是在设置 InMemoryCache 时配置的:

    const cache = new InMemoryCache({
      cacheRedirects: {
        Query: {
          book: (_, args, { getCacheKey }) =>
            getCacheKey({ __typename: 'Book', id: args.id })
        },
      },
    })
    

    不幸的是,在编写这个答案时,我没有't believe there'用于删除id的缓存项目的任何方法 . 围绕这一点正在进行讨论here(原始问题here) .

相关问题