【问题标题】:How to handle Apollo cache updates for queries with multiple arguments (e.g. tabular data)如何处理具有多个参数的查询的 Apollo 缓存更新(例如表格数据)
【发布时间】:2019-07-18 04:21:19
【问题描述】:

我的问题的快速总结

我有一个getTracks 查询,它将获取跟踪数据,并接受一些用于排序/过滤的参数(限制、偏移、搜索、排序、排序)。不幸的是,Apollo 会单独缓存所有这些,因此当一个项目在一个视图中被删除时,用户会更改排序顺序并且被删除的项目仍然存在(因为它在缓存中用于不同的参数集)。

详情

这是 getTracks 查询以及相关输入类型(在我的服务器端 AppSync 架构中):

input SelectOptions {
  limit: Int
  offset: Int
  sort: String
  order: String
  search: String
}

type Query {
  getTracks(options: SelectOptions): TrackList!
}

type TrackList {
  total: Int!
  items: [Track!]!
}

在 Vue 客户端中,查询如下所示:

query GetTracks($options: SelectOptions) {
  getTracks(options: $options) {
    total
    items {
      id
      name
      runtime
      createdAt
      metadata {
        trackNum
        trackName
        artistName
        albumName
        year
      }
    }
  }
}

第一次显示表格时,项目加载并显示正常(默认排序顺序为 createdAt/desc)。如果我按 createdAt/asc 排序,则会发出网络请求以获取结果,并且它们显示得很好。现在,如果我删除其中一条记录,然后再次按 createdAt/desc 排序,则会显示已删除的项目,因为它是从缓存中提取的。

即使查询有不同的参数,Apollo 有没有办法让它智能地从缓存中删除(或添加/修改)项目?我确实尝试了@connection 指令as documented here,但它只是让它排序表没有效果(它根本不会从服务器获取)。

我完全被卡住了,准备完全禁用缓存,因为它在现实世界的场景中似乎不起作用。如何保持默认的 cache-and-network 策略,但在数据更改时让我的表正常运行?

【问题讨论】:

  • 如果您在突变的update 选项中使用cache.modfiy,它将调用您为该字段缓存的所有参数变体的回调函数,允许您从任何其中。

标签: vue.js graphql apollo apollo-client vue-apollo


【解决方案1】:

不幸的是,this issue has been brought up before 并没有一个好的现有解决方案。最大的问题是客户端和缓存都没有公开任何方法来获取给定查询的所有请求——如果你有这些信息,你可以遍历请求并适当地更新缓存。

您可以做的下一个最好的事情是利用apollo-link-watched-mutation。该链接让我们可以有效地识别每个突变需要更新的一个或多个查询,但它使用操作名称来识别查询(以及哪些突变应该触发它们)。这样,您甚至不需要知道更新查询的相关变量——您只需要一致地命名您的操作。

new WatchedMutationLink(
  cache,
  {
    SaveTodo: {
      TodoList: ({ mutation, query }) => {
        // update logic here
      }
    }
  }
)

这种方法的一个缺点是您无法在每个组件的基础上定义update 逻辑。但是,您也可以通过使用不同名称的突变来绕过该限制。

【讨论】:

  • 谢谢!不幸的是,我发现 apollo-link-watched-mutation 太复杂了,我不喜欢,所以我只是编写了自己的缓存实用程序,它可以完美运行。
猜你喜欢
  • 2017-10-05
  • 2020-05-11
  • 2019-01-09
  • 2018-10-24
  • 2018-11-22
  • 1970-01-01
  • 2020-02-12
  • 2017-10-16
  • 2023-03-10
相关资源
最近更新 更多