編集可能な値(*大きな値> 1000)の大きいjsonを扱っています。私は全く同じページにレンダリングされていますので、私の状態は単に{ data: bigBigJson }
です。大きな状態のReact/Reduxパフォーマンス
最初のレンダリングはかなり長いですが、問題ありません。
入力がonChange
(およびreduxアクション)をトリガーすると、値が状態で更新され、全体のレンダリングが再び行われるという問題があります。
私は人々がそれをどのように処理するのだろうか?シンプルなソリューションがあります(必ずしもベストプラクティスではありません)。
注:
JSON文書が外部のAPIが提供され、私はそれを
を変更することはできません私はそれが複数のです(いくつかのサブ状態に状態を分けることができレベルjson)を使用していますが、よりシンプルで高速なソリューションを望んでいます(おそらくベストプラクティスだと思います)。
私はreactとreduxを使用していますが、immutable.jsではなくすべてが不変です明らかに)
-
更新(DSSの答えについて)
•(ケース1)の状態があるとしましょう:すべて、
{
data: {
key1: value1,
// ...
key1000: value1000
}
}
keyN
が更新されるととにかく状態は再レンダリングされるでしょうか?減速機は次のようなものを返します:
{
data: {
...state.data,
keyN: newValueN
}
これは本当に私の場合ではありません。
•(ケース2)の状態は、より多くの(単純化されたオーバー)のようなものです:
{
data: {
dataSet1: {
key1: value1,
// ...
key10: value1000
},
// ...
dataSet100: {
key1: value1,
// ...
key10: value1000
}
}
}
dataN.keyN
が更新されると、私は減速
{
data: {
...state.data,
dataN: {
...state.data.dataN,
keyN: newValueN
}
}
}
に戻ってくる、私は私がやっていると思いますそれは本当に素晴らしいとは思わないので、何か間違っている。 は、それはそのような何かを変更します
// state
{
dataSet1: {
key1: value1,
// ...
key10: value1000
},
// ...
dataSet100: {
key1: value1,
// ...
key10: value1000
}
}
// reducer
{
...state,
dataN: {
...state.dataN,
keyN: newValueN
}
}
を最後に、ちょうど私の減速は、(単純化されたまだ少し)どのように見えるかをここでより多くので、私の場合についてより具体的に:
import get from 'lodash/fp/get'
import set from 'lodash/fp/set'
// ...
// reducer:
// path = 'values[3].values[4].values[0]'
return {
data: set(path, {
...get(path, state.data),
value: newValue
}, state.data)
}
で•場合あなたは不思議に思っている、私はちょうど使用することはできません。他のプロパティとして
data: set(path + '.value', newValue, state.data)
をも更新する必要があります。
「keyNが更新された場合は、すべての状態がそのまま再描画されますか?減速器は、」と答えます。いいえ、keyNのみが再レンダリングされます。 _other_アイテムをレンダリングするコンポーネントは、(React-Reduxはこれを行います)オブジェクト参照が(そのキーのために)同じであることを認識し、レンダリングをスキップします。 – DDS
すべての値が同じ反応コンポーネントで使用/レンダリングされる場合(1つの 'render()'のみ)?唯一の方法は、これをより小さなサブコンポーネントに分割することです。 (それは生成され、動的に '.connect()'されます) – Cohars
あなたはそれをうまくやっているように見えます(少なくとも{ ...状態、 データN:{ ... state.dataN、 keyN: newValueN } } '、lodash fpにあまりよく知られていません。多くのコンポーネントを使用すると、接続された各コンポーネントに通知が送られるため、処理が遅くなることに注意してください。これは速いですが、たとえ速くても多くのことをやっていると結構です。あなたが対処していることの1つは、オブジェクトキーを繰り返し実行する前に毎回フェッチする必要があることです。これには時間がかかります。キーをデータオブジェクトの横の状態(キー付き)に格納する方がよい場合があります。 – DDS