Как улучшить реакцию в клиенте apollo с помощью реакции только один раз

Я делаю запрос GraphQL, в котором я получаю много данных и затем вычисляю минимальные и максимальные значения. Поскольку расчет занимает довольно много времени, я хотел бы делать это только после получения значения. К сожалению, метод props вызывается каждый раз при повторной визуализации компонента, даже если не было нового вызова, а данные поступают из хранилища. Как я могу ограничить расчет точками, в которых я действительно получаю новые данные

graphql(DataQuery, {
    options: ({ id }) => ({
        variables: {
            id,
        },
    }),
    props: ({ data: { result} }) => ({
        data: result,
        min: getMin(result),
        max: getMax(result),
    }),
})
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
91
1

Ответы 1

Эта проблема аналогична проблема в редукции, где mapStateToProps() будет вызываться снова каждый раз, когда магазин обновляет повторяющиеся дорогостоящие вычисления.

Вы можете решить эту проблему, используя запомненные селекторы:

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
    }),
})

Запомненные селекторы запоминают последний результат вызова и продолжают возвращать его при последующих вызовах, пока ввод не изменится.

Другие вопросы по теме