vue.js - 从 apollo 缓存中读取查询,该查询尚不存在,但所有信息已存储在缓存中

标签 vue.js graphql apollo-client

我有一个 graphql 端点,可以在其中输入此查询:

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,但我必须检查此查询返回的结构。

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

最佳答案

您可以使用客户端的 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 })
    },
  },
})

不幸的是,在写这个答案时,我不相信有任何方法可以通过 id 删除缓存的项目。正在进行讨论 here围绕这一点(原始问题 here )。

关于vue.js - 从 apollo 缓存中读取查询,该查询尚不存在,但所有信息已存储在缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52744328/

相关文章:

javascript - GraphQL中如何获取peer字段?

javascript - 使用 ApolloLink.split 时处理 Apollo Client 的错误

reactjs - 从 apollo-client 中的客户端缓存中删除项目的正确方法

vue.js - createApp({}).mount ('#app' ) 清除 vue3 中#app 的子元素

laravel - :change and v-on:change in vuejs?有什么区别

vue.js - Favicon 未显示在 VueJS 中

node.js - 如何让 create-react-app 使用 IP 连接到我的 api 服务器?

使用单独的数据服务器测试 apollo graphql 容器

javascript - 正在搜索的项目取决于以前的结果

graphql - 如何将字段列表片段插值移到括号之外