2016-12-01 1 views
0

私の現在のリアクトサンプル実装のようなものに見えるレンダリング反応します。そのことは何度も何度も同じことをしています。 ReactChildComponentだけを最終的な配列インデックスに追加する方法がありますか?私はただ一度だけ、配列の最後のインデックスに値を割り当てることができますし、それだけが残っているので、私は毎回、配列を反復処理する必要がないようにPreventが

var MyComponent = React.createClass({ 
    getInitialState: function() { 
     return {x: []}; 
    }, 

    ComponentWillReceiveProps: function() { 
     this.state.x.push(this.props.data); 
    }, 

    render: function() { 
     var x = this.state.x; 
     var xl = x. length; 

     x[xl - 1] = React.createElement(SomeChildComponent, {prop1: val1, prop2: val2}); 

     return (
       React.createElement('div', {}, xl)); 
    } 
}); 

:ような何か。私はこれを試しましたが、どういうわけかComponentWillReceivePropsは呼び出されず、配列は空になります(したがって、長さ1のインデックスを破るコードを選択します)。

これを実装するためのきちんとした方法はありますか?これは良い選択ですか?ほとんどの人は、たいていの場合、最初の例に示すように、mapを使用してループ全体にわたって繰り返しているのです。

私のアプリケーションでは、リアルタイムアプリケーションとして実現できるほどのパフォーマンスを提供しなければならないと想定しているため、毎回アレイを再確認する必要はありません。

答えて

1

ベストプラクティスは毎回アレイ全体を反復することです。これにより、コンポーネントのレンダリング時に状態が常に正確に表現されます。マップ関数は、パフォーマンスが向上する限り(配列に数十万または数十万のアイテムがない限り)、比較的安価である必要があります。

Reactのアイデアは、DOMを更新するときにjavascriptアプリケーションのパフォーマンスのボトルネックがしばしば発生するということです。 ReactはDOMをスマートに更新するため(https://facebook.github.io/react/docs/reconciliation.html)、パフォーマンスの問題を回避するのに役立ちます。この利点は、配列の変更に伴い要素の追加と削除を追跡する必要がないことです。反応があなたのためにそれを行います。

この後ろにさらに説明や推論が必要な場合は教えてください。もっと読むにはhttps://facebook.github.io/react/docs/rendering-elements.html#react-only-updates-whats-necessary

+0

こんにちは、ありがとうございました。これはチャットをロードするチャットアプリケーションのセクションであり、前のコンポーネントは変更されないため、新しいコンポーネントのみが追加されます。また、遅延ロードを実装しないで、何千ものメッセージを格納しなければならないとしたら、その解決策は何ですか? – user3271166

+0

最初の質問では、新しいアイテムを読み込むときに、この不変性ヘルパーを使用することをお勧めします:https://github.com/kolodny/immutability-helper。 配列にプッシュするのではなく、毎回新しい配列を作成します。例えば、 'this.setState({array:{array:{'array'、 'with'、 'new '、' items ']}}}) ' これはなぜですか?配列にプッシュするとReactが再びレンダリングされるのではなく、新しい配列を状態として設定するためです。あなたが考えるかもしれないことにもかかわらず、それは実際にパフォーマンスや悪いメモリヒットではありません。 –

+0

2番目の質問では、このシナリオを許可しないでください。ユーザーは自分の画面に一度に多くのチャットアイテムしか置くことができず、100,000のメッセージをスクロールすることは何があってもパフォーマンスに影響します。以前のチャットを読み込んだり、必要に応じて読み込んだりする必要があります。私の推測でさえ、10,000個のメッセージは、アプリケーションの可視領域にないときにDOMにレンダリングしない限り、問題ありません。 –

関連する問題