在我的Apollo Client 3应用程序中,我正在做一个突变,并希望将结果缓存到一个集合中,该集合嵌套在集合的一个项目中。
具体来说,我在一个评论列表中创建一个comment
,每个列表在一个帖子中,每个帖子在一个帖子列表中。我的应用程序的数据层次结构看起来像:
user 1
profile 1
post 1
comment 1.1
comment 1.2
post 2
comment 2.1
comment 2.2
< write mutation result here >
post 3
comment 3.1
comment 3.2
comment 3.3
...
在这种情况下,我如何最好地将创建的评论缓存到其父帖子的评论集合中?我正在看useMutation
钩子的update
或modify
配置,但我不太确定。
对于其他上下文,下面是与上述数据层次结构对应的查询:
query getUserPosts($userParams: GetUserParams!$postsPaginationParams: CursorPaginationParams!) {
user(params: $userParams) {
id
profile {
id
# ...
ownedPosts(pagination: $postsPaginationParams) {
items {
id
# ...
featuredComments {
id
primaryText
creationTimestamp
owner {
id
name
}
}
}
pagination {
# ...
}
}
}
}
}
这是我的突变:
input CreateCommentParams {
ownerId: String!
postId: String!
primaryText: String!
}
mutation createComment($params: CreateCommentParams!) {
createComment(params: $params) {
id
owner {
id
name
}
primaryText
creationTimestamp
}
}
以下是useMutation
到目前为止的情况:
useMutation(CREATE_COMMENT_MUTATION, {
// ...
update: (cache, { data }) => {
if (data) {
const cacheId = cache.identify(data.createComment);
cache.modify({
fields: {
// ...how to update the comments array of the specific post?
}
})
}
},
})
您需要找到您正在更新的Post并更新其featuredComments字段,如下所示:
useMutation(CREATE_COMMENT_MUTATION, {
// ...
update: (cache, { data }) => {
cache.modify({
id: cache.identify({
__typename: 'Post', // Assuming your this is the _typename of your Post type in your schema
id: postId,
}),
fields: {
featuredComments: (previous, { toReference }) => [...previous, toReference(data.createComment)]
},
}),
}),
})