useMemoは、リストがスクロールするときにすべての行を(完全に)再レンダリングすることを回避するのに役立つことがわかりました。これは、(リストを保持する)親コンポーネントが再レンダリングするときにも発生するようにしたいと思います。
デモ:
https://codesandbox.io/s/v8k75vw0v0
スクロールすると、新しい行が作成されているときにのみActual Row
ログメッセージが表示されることがわかります。
これは、 Rerender parent
ボタンをクリックした場合には当てはまりません。
対照的に、 FakeList
は、コンポーネントではなく関数として_row_を使用することにより、_row_がuseMemo
を利用できるようにすることができます。
ですから、これはuseMemoを十分に活用する方法についての質問だと思います。
ドキュメントのこの部分を読みましたか? https://react-window.now.sh/#/examples/list/memoized -list-items
2つの組み込みのメモ化オプションがあります。
例でも使用されているようには見えません。これにより、react-windowがスタイルキャッシュを管理する方法が原因で、不要な再レンダリングが発生します。
この問題は、このライブラリの一部を変更する必要はないと思うので、クローズします。 ご不明な点がございましたら、お気軽にお問い合わせください。
またあったね、
私の例は、私が表現しようとしたことに対して最も雄弁ではありませんでしたが、今はできると思います。
あなたの例(memoized-list-items)から始めて、表示されようとしている_rows_をレンダリングするだけでなく、アイテムを_アクティブ化_するとき(現在、アイテムをクリックしてアクティブ化するとき)のレンダリングも最小化したいと思います。 、ビュー内のすべての_rows_が再レンダリングされます)。
私が最終的に達成していること使用してitemData
小道具のFixedSizeList
(これは私がネストされたクロージャを避けましょう)。 これにより、 useMemo
使用できるようになります。
この問題は解決されたままである必要がありますが、これは興味深い例/最適化の演習であると思います。さらにご意見をお寄せいただければ幸いです。
結果はここにあります: https :
ラッパーを犠牲にしてEXPENSIVE RENDER
を避けます: CHEAP PREP
。
このライブラリにご尽力いただきありがとうございます。
ええ、それは理にかなっています。 itemData
が変更されると、アイテムのキャッシュが_意図的に_破壊されます。 ほとんどの場合、これは古いデータを回避するために実行したいことです。 これが特定のユースケースに当てはまらないことがわかっている場合は、これまでに行ったようなカスタムロジックが適切と思われます。 👍
最も参考になるコメント
ドキュメントのこの部分を読みましたか? https://react-window.now.sh/#/examples/list/memoized -list-items
2つの組み込みのメモ化オプションがあります。
React.memo
例でも使用されているようには見えません。これにより、react-windowがスタイルキャッシュを管理する方法が原因で、不要な再レンダリングが発生します。
この問題は、このライブラリの一部を変更する必要はないと思うので、クローズします。 ご不明な点がございましたら、お気軽にお問い合わせください。