reactjs - 如何增强apollo客户端的响应能力并仅响应一次

标签 reactjs apollo react-apollo apollo-client

我进行了一个 GraphQL 查询,在其中获取了大量数据,然后计算最小值和最大值。由于计算非常耗时,我只想在收到该值时才进行计算。不幸的是,即使没有新的调用,每次重新渲染组件时都会调用 props 方法,并且数据来自存储。如何将计算限制在真正获得新数据的点

graphql(DataQuery, {
    options: ({ id }) => ({
        variables: {
            id,
        },
    }),
    props: ({ data: { result} }) => ({
        data: result,
        min: getMin(result),
        max: getMax(result),
    }),
})

最佳答案

此问题类似于the problem in redux其中每次存储更新时都会再次调用mapStateToProps(),重复昂贵的计算。

您可以使用 memorized selectors 来解决这个问题:

import { createSelector } from 'reselect'

const getMinMax = createSelector(
  result => result,
  result => ({
      min: getMin(result),
      max: getMax(result),
  })
)

graphql(DataQuery, {
    options: ({ id }) => ({
        variables: {
            id,
        },
    }),
    props: ({ data: {result} }) => ({
        data: result,
        ...getMinMax(result), // will only re-calculate if result changed
    }),
})

内存选择器会记住调用的最后结果,并且只要输入不更改,就会在后续调用中继续返回该结果。

关于reactjs - 如何增强apollo客户端的响应能力并仅响应一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51270260/

相关文章:

javascript - 无法在 React 中使用 addGraphQLSubscriptions,状态为 "Object(...) not defined)"

javascript - Normalizr - 未达到预期结果

reactjs - 如何为 graphql 生成 TypeScript 定义

graphql - 为什么Apollo Client下载:schema fail with "Error: Cannot find module ' graphql/validation/rules/UniqueTypeNames'"

javascript - 如何更改 graphql 端点 url 名称

reactjs - Apollo React subscribeToMore 不更新数据

reactjs - Rollup Build 对于组件库来说似乎太大了

javascript - 太多的事件处理程序会影响 React 应用程序的性能吗?

reactjs - 带有 Material UI 的对话框上方的 Snackbar

reactjs - 如何让 Typescript 识别 Apollo 查询的类型