【发布时间】:2017-08-04 18:16:00
【问题描述】:
我有一个查询,它返回多个嵌套对象以呈现一个充满信息的屏幕。我想删除一个深度嵌套的对象并乐观地更新屏幕(即不运行完整的查询)。
为了解释查询和 UI,我将使用类似 Trello board 的查询作为示例:
query everything {
getBoard(id: "foo") {
name
cardLists {
edges {
node {
id
name
cards {
edges {
node {
id
name
}
}
}
}
}
}
}
}
此查询的结果用于构建这样的 UI:https://d3uepj124s5rcx.cloudfront.net/items/170a0V1j0u0S2p1l290I/Board.png
我正在使用以下方式构建应用程序:
- VueJS
- Vue 阿波罗
- Scaphold.io 作为我的 GraphQL 商店
当我想删除其中一张卡片时,我会调用:
deleteCard: function () {
this.$apollo.mutate({
mutation: gql`
mutation deleteCard($card: DeleteCardInput!) {
deleteCard(input: $card) {
changedCard {
id
}
}
}
`,
variables: {
'card': {
id: this.id
}
},
})
.then(data => {
// Success
})
}
突变成功删除卡片,但我想根据突变立即更新 UI。执行此操作的简单选项是调用 refetchQueries: ['everything'] — 但这是一个昂贵的查询,而且对于快速 UI 更新来说太慢了。
我想做的是乐观地更新 UI,但是 Vue Apollo 的 example mutations 既没有解决删除问题,也没有解决深度嵌套的场景。
从深度嵌套的查询中删除项目并乐观地更新 UI 的正确解决方案/最佳实践是什么?
【问题讨论】:
-
如何在突变后更新查询,使用
updateQueries或 apollo 客户端的dataIdFromObject属性? -
@Locco0_0 - 我正在使用
updateQueries。我是否可以使用dataIdFromObject直接从商店中删除该对象,而不是更新查询? -
是的,如果您向突变的返回值添加更深的嵌套,例如添加 cardLists 的 id 并在其中添加卡片。但它当然更慢。
标签: vue.js graphql apollo-client