Идиоматический способ кэширования вычисленных значений на основе состояния в React?

Реагирующая документация говорит

Не беспокойтесь о предварительных вычислениях значений на основе состояния - проще убедиться, что ваш пользовательский интерфейс согласован, если вы выполняете все вычисления в render().

http://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html

Это имеет смысл, когда вычисления малы.

Но я храню кучу больших массивов в this.state для визуализации данных, которую я передаю на SVG. Я должен вычислить несколько значений на их основе. Дело в том, что эти вычисления довольно тяжелые, и невозможно вычислить их всегда в рендере.

Итак, как мне следует кэшировать эти вычисления, гарантируя, что я не получаю несогласованное состояние с this.state и этими вычисленными переменными?

Ответ 1

Думаю, я это понял.

Я переместил большие массивы в состояние родительского компонента, и я просто передам их как опоры для компонента визуализации. Затем я просто вычисляю значения в componentDidMount и componentWillReceiveProps и сохраняю их в состоянии компонента визуализации.

Это позволяет избежать большинства бесполезных вычислений в моем случае. Но если этого недостаточно, я могу пойти дальше и разложить текущие реквизиты со следующими реквизитами в componentWillReceiveProps, чтобы определить, действительно ли требуется вычисление.

UPDATE: теперь, когда я больше работал с React, я думаю, что это нужно сделать, используя memoizing. Reselect - это хорошая lib для этого.

Ответ 2

Я попробовал визуализацию данных с помощью React и SVG, но пока не имел проблем с производительностью. Реагировать только на rerender при изменении состояния или изменении состояния родительского компонента, чтобы эти вычисления не выполнялись очень часто.

Если в вашем случае компоненты часто обновляются, вы можете попробовать memoize вычислительные функции с помощью lodash.