Apollo GraphQl 存储派生数据

IT技术 reactjs graphql apollo react-apollo apollo-client
2021-05-22 22:10:51

一些上下文:我正在开发一个 React JS 应用程序,它从数据库中读取地理点并以各种方式绘制/映射它们。有原始地图和图表直接显示来自数据库的数据,但也有图表和指标涉及对斜率图、图下面积、直方图、欧几里德距离等点的分析。

我设置了一个 GraphQL 客户端,用于将数据提供给安装了 Apollo-Client 的 React 应用程序。这是 GraphQL 响应的示例:

{
  "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
    ]
  }
}

这很棒!对于至少 2 个不同的数据视图来说,这是正确的形状,Apollo 客户端为我缓存了它,我InMemoryCache根本不需要 redux。

困境:我需要的一堆图涉及许多可重用的派生值(就像我可能在 2 个不同视图中使用斜率值一样)。我应该在哪里存储我的派生数据?

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

选项:

  1. 将 Redux 用于派生数据,将所有计算放入 reducer 并以某种方式使其与 Apollo graphql 缓存中的内容保持同步。
  2. 在服务器上进行派生(然后我可以缓存)并通过网络发送原始 + 派生。更多的网络流量,但更少的客户端计算。
  3. render()每当传入的 graphql 数据发生变化时,继续计算内部的派生值
  4. 可能是我没想到的……
1个回答
  1. Redux 可能是一个很好的选择 - 关注点/逻辑/数据的分离和良好的可测试性。
  2. 这取决于最终的缓存命中/未命中率、额外资源/功率的成本 - 我会避免这种情况。
  3. 渲染不是计算的最佳位置(还有其他生命周期方法)。组件可以使用自己的状态(或新的 getDerivedStateFromProps),但只能与孩子共享。
  4. 您可以使用react context apiapollo-link-state共享数据/方法。您可以尝试 observables/mobx-like 解决方案。

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