graphql - Apollo 如何足够聪明地知道何时合并,但不知道何时添加?
问题描述
所以我在我的 React Apollo 应用程序上有一个表单,可以添加或更新用户。接收数据时,如果用户存在,Apollo 会知道并正确合并/规范化数据。
如果不是,它什么也不做,我需要像这样手动附加它:
const result = await this.props.upsertPersonMutation({
variables: {
...this.state.fields,
},
update: (store, { data }) => {
// somewhere in here I'll need to check if it's new or not
const initDataQuery = store.readQuery({query: INIT_DATA});
const { upsertPersonMutation } = data;
initDataQuery.getInitData.user.people.push(upsertPersonMutation)
store.writeQuery({query: INIT_DATA, data: initDataQuery})
}
}).then(response => {
this.setState({
isLoading: false
});
this.props.closeCallback();
})
虽然我对它能够做到前者印象深刻,但为什么它不能将新条目附加到数组中?我觉得如果它只解决了一半的问题,可能就达不到目的了,你知道吗?
解决方案
发生这种情况是因为在执行突变后,apollo 客户端会检查 apollo 缓存中是否有任何具有相同标识符键的项目。如果有,它会自动更新。Apollo 将这些更新称为Automatic Cache Updates。
如果缓存中没有与突变结果匹配的内容,apollo 客户端将不会添加它。突变被明确地用于改变对象和查询以获取它们。使用该update
函数是通过突变添加它的方法。
默认情况下,标识符键是<__typename>:<id>
,<__typename>:<_id>
或访问对象的路径。阅读此链接以了解有关Apollo 如何规范化缓存的更多信息。
推荐阅读
- woocommerce - 从结帐页面店面主题woocommerce中删除面包屑
- python - 如何在 Pandas 中展平双嵌套 json 文件
- java - java springdoc @ApiResponses 如何定义一个列表作为返回对象使用
- heroku - 升级到没有 webpacker 的 Rails 6.0 | Heroku 生产中没有 scss / bootstrap
- windows - Electron-installer-windows 在 macOS 上不起作用
- awk - 将文件的最后一行捕获为整数变量并在 awk 命令中使用
- reactjs - React JS 中的 findDOMNode 替代方案
- comparison - 如何比较两个多类混淆矩阵的性能?
- python - 同时显示实时数据和命令行输入
- react-native - 如何在滚动视图下传递触摸事件以查看本机反应