利用 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 (将#修改为@)