1

我的 Apollo 缓存中存储了很多活动查询,例如:

items(isPublished: true, orderBy: "name", filterByName: "")
items(isPublished: true, orderBy: "name", filterByName: "home")
items(isPublished: false, orderBy: "name", filterByName: "home")
items(isPublished: true, orderBy: "age", filterByName: "home")
...

因此,同一查询(GET_ITEMS )的许多可能变量,具有越来越多的过滤器。当我想添加、移动或删除一个项目时,我会使用 Mutation 组件的属性更新来更新 Apollo Cache,例如:

import gql from "graphql-tag";
import { Mutation } from "react-apollo";

const ADD_ITEM = gql`
  mutation AddItem(...
`;

...

<Mutation mutation={ADD_ITEM} variables={...} update={() => ...} />

但是,如果我想很好地更新我所有的缓存查询......我如何做到这一点?对于每个查询,我是否必须在更新函数中缓存.readQuerycache.writeQuery ?那对我来说太疯狂了。

我迷路了。提前致谢。

4

1 回答 1

1

这是 ApolloClient 的不幸限制之一,但可以通过使用apollo-link-watched-mutation来解决。链接允许您通过操作名称关联突变和查询,这样对于具有特定操作名称的任何突变,都可以更新具有特定操作名称的所有查询。这种方法最大的缺点是它将更新逻辑移到组件之外并进入客户端配置,这可能会使事情变得有些模糊。

示例用法,给定一个名为的突变和名为的AddItem查询Items

const cache = new InMemoryCache()
const link = new WatchedMutationLink(cache, {
  AddItem: {
    Items: ({ mutation, query }) => {
      const addedItem = mutation.result.data.addItem
      const items = query.result.items
      const items.push(addedItem)
      return {
         ...query.result,
        items,
      }
    }
  }
})

请注意,您可以检查传递给函数的查询和突变,以确定需要更改的内容(如果有的话)。您的实际代码可能会根据您的查询的实际外观而有所不同,这是一个示例。有关其他详细信息,请参阅文档。

于 2019-06-28T21:03:48.097 回答