如何解决利用 Apollo 缓存
升级到 Apollo 客户端 3.3 时,我们决定启用缓存 以减少网络流量并节省计算能力。 我们试图实现这样的东西:
cache: new InMemoryCache({ typePolicies: {
VegaSpecification: {
keyFields: ["reportID"]
},Query: {
fields: {
report: {
merge: true
}
}
} } })
然而,Apollo 中实现的缓存不适合我们的数据结构 因此我们收到了错误的结果。
首先我们使用过滤器 a 查询报告。 我们在缓存中没有该查询的任何数据,因此我们点击后端并接收
{
_id: "initialReportId",vegaspecification: {
reportID: "initialReportId",data: "data for a"
}
}
在缓存中 apollo 自动存储:
Report: {
_id: "initialReportId",vegaspecification: {
"__ref":"VegaSpecification: {"reportID":"initialReportId"}"
}
}
VegaSpecification: {
reportID: "initialReportId",data: "data for a"
}
然后我们使用过滤器 b 查询报告。 我们再次在缓存中没有该查询的数据,并点击后端并接收
{
_id: "initialReportId",vegaspecification: {
reportID: "initialReportId",data: "data for b"
}
}
在我们更新的缓存中
Report: {
_id: "initialReportId",vegaspecification: {
"__ref":"VegaSpecification:{"reportID":"initialReportId"}"
}
}
VegaSpecification: {
reportID: "initialReportId",data: "data for b"
}
当我们再次查询过滤器 a 的报告时,缓存会被访问,因为已经存在一个查询:
Report: {
_id: "initialReportId",vegaspecification: {
"__ref":"VegaSpecification:{"reportID":"initialReportId"}"
}
}
然后对 VegaSpecification 的引用被解析 - 返回
VegaSpecification: {
reportID: "initialReportId",data: "data for b"
}
因此我们返回了过滤器 a 的错误数据。我们使用“useMemo”来重新计算记忆值。
我们如何构建我们的实体,以便针对不同的查询使用 我们收到的不同查询变量可以通过 id 区分
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。