React 0.14のステートレスコンポーネントは、shouldComponentUpdateなしでどのようにパフォーマンスを向上させるのですか?


8

この質問は、React 0.14に関するリリースノート(およびその他の関連する誇大広告)を読んでから、頭の中で何度も繰り返されています -私はReactの大ファンで、ステートレスコンポーネント(https://facebook.github。 io / react / blog / 2015/09/10 / react-v0.14-rc1.html#stateless-function-components)は、そのようなコンポーネントを簡単に記述できることと、これらのコンポーネントの意図をコードで表現することの両方にとって優れたアイデアです。コンポーネントは、同じ小道具データを一貫してレンダリングするという点で「純粋」である必要があります。

問題は、Reactがこれらのステートレスコンポーネント関数を完全に最適化せずに最適化し、props参照がコンポーネント内で操作されないだけでなく、変更できないという点で不変であると仮定して、どのように最適化できるかです。コンポーネントのライフサイクル外ですか?「通常の」コンポーネント(ステートフルコンポーネント、つまりライフサイクル全体を通過するコンポーネント。componentWillMount、getInitialStateなど)にオプションの「shouldComponentUpdate」関数があるのは、Reactがすべてのプロパティと状態参照は完全に不変です。コンポーネントがレンダリングされた後、props参照の特定のプロパティが変更される可能性があるため、同じ「props」インスタンスには後で異なるコンテンツが含まれる可能性があります。これが、完全に不変の構造体を使用することに大きな興奮をもたらした理由の1つであり、ReactでOmを使用すると、パフォーマンスが大幅に向上すると言われているのです。そこで使用された不変の構造体は、オブジェクトの特定のインスタンスが決して変更されないことが保証されているため、shouldComponentUpdateは、propsとstate(http://swannodette.github.io/2013/12/17/the-future-of-javascript-mvcs/)。

私はこれについてより多くの情報を見つけようとしましたが、どこにも行きませんでした。小道具のデータが不変のタイプで構成されると仮定せずに、ステートレスコンポーネントの周りでどのようなパフォーマンスの向上が見込めるかは想像できません。おそらく、「小道具」と「nextProps」が同じデータ?

私は誰かが内部情報を持っているのか、あるいはこれに関する他の啓蒙的な洞察を持っているのかと思っただけです。Reactが小道具のタイプを「完全に不変」にするよう要求し始めた場合(データが変更されていないことを確認するために参照等価比較を許可します)、それは大きな前進になると思いますが、大きな変更になる可能性もあります。

回答:


4

これについては、反応プロジェクトにgithubの問題があります。

このgithubの問題のコメントによると

複雑なコンポーネントの場合、shouldComponentUpdate(たとえば、純粋なレンダリング)を定義すると、通常、ステートレスコンポーネントのパフォーマンス上の利点を上回ります。ドキュメント内の文は、私たちが計画した将来の最適化をほのめかしています。これにより、ステートレス機能コンポーネントに内部インスタンスを割り当てません(関数を呼び出すだけです)。また、小道具などを保持しない場合もあります。小さな最適化。最適化はまだ実際には実装されていないため、ドキュメントで詳細については触れません(ステートレスコンポーネントはこれらの最適化への扉を開きます)。

同じコラボレーターからの別の返信から:

関数に設定できるpureRenderフラグを設定したり、shouldUpdateライフサイクルに参加できるようにすることについての議論がありますが、現在は実装されていません。現時点では、ステートレス関数を純粋にレンダリングすることはできません。

最後にこのコメントから私たちはあなたの質問に対する答えを得ます:

デフォルトでは純粋なレンダリングは行いませんが、将来的にオプトインする方法を提供する可能性があります。

したがって、「pureRender」をオプトインできるようにする方法を確認する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.