Apollo GraphQl存储派生数据

时间:2018-08-24 20:52:27

标签: reactjs graphql apollo react-apollo apollo-client

某些上下文:我正在开发一个React JS应用,该应用可以从数据库中读取地理点并以各种方式对其进行图形化/映射。有一些原始图和图仅显示数据库中的数据,但也有一些图和度量涉及对点的分析,例如斜率图,图下面积,直方图,欧几里得距离等。

我设置了一个GraphQL客户端,以便在安装了Apollo-Client的情况下向我的应用程序提供数据。这是GraphQL响应的示例:

FLUSH PRIVILEGES;

太好了!对于至少两个不同的数据视图来说,这是正确的形状,Apollo客户端使用{ "data": { "Points": [ { "pid": 13196, "x": 251.88491821289062, "y": 374.1650085449219 }, { "pid": 13197, "x": 257.6238708496094, "y": 374.17498779296875 }, { "pid": 13198, "x": 264.04315185546875, "y": 374.5350036621094 }, ...etc ] } } 为我缓存了这个形状,而且我根本不需要redux。

困境:我需要一堆图,其中涉及许多衍生值,这些值被重用(例如我可能在2个不同的视图中使用斜率值)。我应该在哪里存储导出的数据?

现在,我把所有计算都塞进了React InMemoryCache方法中,但这似乎不是一个好主意。

选项:

  1. 将Redux用于派生数据,将所有计算结果放入化简器中,并以某种方式使其与Apollo graphql缓存中的内容保持同步。
  2. 在服务器上进行派生(然后可以对其进行缓存),并通过网络发送两个原始+派生。更多的网络流量,但更少的客户端计算。
  3. 每当传入的graphql数据发生变化时,继续计算render()内部的派生值。
  4. 也许我没想到...

1 个答案:

答案 0 :(得分:1)

  1. Redux可能是很好的选择-关注点/逻辑/数据分离和良好的可测试性。
  2. 这取决于最终的缓存命中率/未命中率,额外资源/功能的成本-我会避免这种情况。
  3. 渲染不是用于计算的最佳位置(还有其他生命周期方法)。组件可以使用自己的状态(或新的getDerivedStateFromProps),但只能与子级共享。
  4. 您可以使用react context apiapollo-link-state共享数据/方法。您可以尝试可观察物/类似Mobx的解决方案。

我还将避免对数据更新自动进行所有可能的重新计算。使用组件/生命周期/上下文,您可以准备(缓存并共享)派生数据何时真正被使用。