这更像是一个悬而未决的问题,但希望它不会被删除。
我正在使用 react 和 apollo,尽管问题更笼统。
假设我的应用中有 3 个不同的视图,它们都使用相似(但不相同)的数据。它们都使用单独的查询,但每个查询都使用通用操作,但返回的数据略有不同。
假设我在某处有一个突变,它向数据添加了一些东西(想想一个项目列表和一个正在添加的新项目)。
假设在突变后我想更新缓存以反映该更改。我正在使用 read/writeQuery 进行更新。使用此设置,我需要更新 3 个查询 - 这将成为维护的噩梦。
经过一番阅读,我认为我做错了——我现在创建了一个查询——现在我只需要在突变后更新那个单一的查询,我的所有视图都会自动更新。然而问题是这个查询现在必须下载所有 3 个视图组合所需的所有数据 - 感觉这非常低效,因为一些视图将获得他们永远不会使用的数据。
有更好的方法吗?
请注意,这read/writeFragment不起作用,因为它们不会更新基础查询-例如检查此答案:https ://stackoverflow.com/a/50349323/2874705
如果您需要更具体的示例,请在评论中告诉我。
总而言之,我认为在这个设置中我会更好地处理全局状态并避免一起使用 apollo 缓存 - 但是我觉得被骗了,因为 apollo 承诺解决状态问题:)
编辑
这是一个具体的例子:
假设我们的 graphql 模式是这样定义的:
type Post {
id: ID!
title: String!
body: String
published: Boolean!
}
type Query {
posts(published: Boolean): [Post!]!
}
type Mutation {
createDraft(body: String!, title: String!): Post
publish(id: Int!): Post
}
现在,我们在客户端创建 3 个查询和 2 个突变
query PostTitles {
posts {
id
title
}
}
query Posts {
posts {
id
title
body
published
}
}
query PublishedPosts {
posts (published: true) {
id
title
body
published
}
}
mutation CreateDraftPost ($body: String!, $title: String!) {
createDraft(body: $body, title: $title) {
id
title
body
published
}
}
mutation PublishPost ($id:ID!) {
publish (id: $id) {
id
published
}
}
请注意createDraft,使用默认值创建帖子false published。
如何使用这些突变中的任何一个来创建或发布帖子并在不使用refetchQueries或手动更新每个查询的情况下更新所有 3 个缓存查询?我认为真正的问题是这些查询中的每一个都单独存储在 apollo 内存缓存中。