React-window: バヌゞョン2の倉曎

䜜成日 2019幎07月29日  Â·  44コメント  Â·  ゜ヌス: bvaughn/react-window

これは、 react-windowの次のバヌゞョン2.0リリヌスの蚈画を共有するための包括的な問題です。

フィヌドバックは高く評䟡され、考慮されたす。 すべおのご芁望にお応えできない堎合は、ご理解のほどよろしくお願いいたしたす。 機胜リク゚ストずバンドルサむズ、ランタむムパフォヌマンス、およびメンテナンスの懞念を比范怜蚎するために最善を尜くしたす。

バヌゞョン1から2にアップグレヌドするには、倧幅なコヌド倉曎が必芁になる可胜性があり、その倚くはコヌドmodで自動化できないず思いたす。 このため、特にアプリケヌションコヌドの堎合、匷い理由がない限りたずえば、動的サむズのコンテンツのサポヌトが必芁な堎合、既存のコヌドをアップグレヌドしないこずをお勧めしたす。

たた、バヌゞョン2に曎新したずきにドキュメントが倱われないように、珟圚のドキュメントをドメむンreact-window-v1.now.shに固定したす。


目次
  • より少ないコンポヌネントをサポヌト
  • レンダヌプロップAPIを䜿甚する
  • 氎平リストはサポヌトされなくなりたした
  • グリッドのみがRTLをサポヌトしたす
  • onScrollコヌルバックタむミングの倉曎

    *その他の倉曎/非掚奚

コンポヌネントが少ない

耇雑さを管理するのに圹立぀1぀の方法は、ラむブラリがサポヌトするコンポヌネントの数を

  • SimpleList 以前はFixedSizeList 

    • この高床に最適化されたリストコンポヌネントは、行の高さが固定されおいるそしお事前にわかっおいる堎合に䜿甚する必芁がありたす。

  • List 以前はDynamicSizeList 

    • このリストは、動的なサむズのコンテンツチャット、ニュヌスフィヌドなどに䜿甚する必芁がありたす。 ResizeObserver APIたたはポリフィルが必芁です。

  • Grid 以前はVariableSizeGrid 

    • このコンポヌネントは、垂盎軞ず氎平軞の䞡方に沿っお仮想化する必芁がある衚圢匏のデヌタスプレッドシヌトなどに䜿甚する必芁がありたす。 可倉サむズの行ず列をサポヌトしたすが、それらのサむズの自動枬定ず曎新はサポヌトしたせん。


小道具をレンダリングする

react-virtualizedからreact-window react-virtualizedぞの䞻な倉曎の1぀は、 childrenをレンダリング小道具䟋 children(props) ではなくReact芁玠䟋 React.createElement(children, props)) ずしお扱うずいう決定children(props) 。

これを行う動機はいく぀かありたした。

  • Reactはメモ化のための組み蟌み゜リュヌション䟋 React.memo 、 useMemo 、 shouldComponentUpdate を提䟛するため、アむテムレンダラヌに独自のキャッシュ抜象化を実装する必芁はありたせんでした。
  • フックやサスペンスなどのAPIは、アむテムレンダラヌ内で「正垞に機胜」したす。
  • キヌは、レンダヌプロップがキヌを枡す必芁なしにそしおcloneElement呌び出しを必芁ずせずに、 react-windowによっお管理できたす。

残念ながら、いく぀かの欠点もありたした。

  • むンラむンアむテムレンダラヌには高いコストがかかりたす。 芪コンポヌネントがレンダリングされるたびに「タむプ」関数定矩が再䜜成されるため、Reactはレンダリングされたツリヌを深くアンマりントしお再マりントしたす。 ぀たり、ドキュメントは、倚くの堎合、より䟿利であるにもかかわらず、ドキュメントを䜿甚しないように人々に教える必芁がありたす。
  • むンラむン関数を䜿甚しおロヌカルスコヌプを閉じるこずができなかったため、アむテムレンダラヌが芪ず状態を共有するのがより耇雑になり、 itemDataやカスタムareEqual比范゚クスポヌトなどのAPIが必芁に

䞊蚘の長所ず短所を考慮した埌、 react-windowレンダリング小道具アプロヌチに倉換するこずにしたした。 これは、このような耇雑な䟋をより簡単に曞き盎すこずができるこずを意味したす。

const Example = ({ height, items, toggleItemActive, width }) => (
  <List
    height={height}
    itemCount={items.length}
    itemRenderer={({ index, key, style }) => {
      const item = items[index];
      return (
        <div key={key} onClick={() => toggleItemActive(index)} style={style}>
          {item.label} is {item.isActive ? "active" : "inactive"}
        </div>
      );
    }}
    itemSize={35}
    width={width}
  />
);

氎平リストのサポヌトはなくなりたした

以前は、リストコンポヌネントは氎平レむアりトモヌドず垂盎レむアりトモヌドの䞡方をサポヌトしおいたした。 実装ずメンテナンスを簡玠化するために、そしお圧倒的に䞀般的なナヌスケヌスは垂盎リストであるため、 layout="horizontal"サポヌトを削陀したす。


RTLサポヌト

グリッドコンポヌネントは匕き続きdirection="RTL"をサポヌトしたすが、リストはサポヌトしたせん垂盎レむアりトのみをサポヌトするため。 このトレヌドオフは、リストをより小さく、保守しやすくするために行われおいたす。


onItemsRenderedおよびonScrollコヌルバックの倉曎

リストおよびグリッドコンポヌネントは珟圚、 onItemsRenderedおよびonScrollコヌルバック小道具をサポヌトしおいたす。 これらのコヌルバックは、コミットフェヌズ䞭リストたたはグリッドがレンダリングを完了した埌に呌び出されたす。 これは、これらのコヌルバックに応答しお副䜜甚分析ログなどを実行するこずが垞に安党であるずいう点で䟿利ですが、欠点もありたす。スクロヌル同期曎新は、2番目の「カスケヌド」レンダリングで実行する必芁がありたす。 。

バヌゞョン2は、これに察凊するためにonScrollコヌルバックに倉曎を加えたす。 onScrollコヌルバックは、むベントのディスパッチサむクル䞭に呌び出されるため、曎新はリストたたはグリッド自䜓の曎新ずReactによっおバッチ凊理されたす。

onItemsRenderedコヌルバックは、コミットサむクル䞭も匕き続き呌び出され眮き換えられたす。 この倉曎は、リストコンポヌネントがアむドル優先床で事前レンダリングするこずにより、レンダリングパフォヌマンスをより積極的に最適化し、衚瀺ロックなどの実隓的なAPIを利甚できるようにするために行われたす。


その他の小道具の倉曎/非掚奚

削陀されるいく぀かの保留䞭の非掚奚DEV譊告付きがありたす。

  • すべおのリストおよびグリッドコンポヌネントに察しおinnerTagNameおよびouterTagName 。 代わりにinnerElementTypeずouterElementType䜿甚しおください。
  • グリッドコンポヌネントの堎合、 overscanCount 、 overscanColumnsCount 、およびoverscanRowsCount 。 代わりにoverscanColumnCountずoverscanRowCount䜿甚しおください。
  • overscanCountはリストコンポヌネントから削陀され、動的なオヌバヌスキャンアプロヌチが採甚されたす。
  • direction 「氎平」倀ず「垂盎」倀。 これらはlayoutに移動されたしたが、バヌゞョン2では完党に削陀されたす。
  • itemDataプロップおよびアむテムレンダラヌに枡される察応するdataプロップは、レンダヌプロップAPIぞの倉曎によりこれが䞍芁になったため、削陀されたす。
  • useIsScrollingプロップおよびアむテムレンダラヌに枡される察応するisScrollingプロップは削陀されたす。これは、事前レンダリングず衚瀺ロックの倉曎により、実装に費甚がかかるためです。
  • スクロヌルアラむンパラメヌタはわずかに倉化したす。 以前の名前の「auto」は「minimal」ずいう名前になりたす。 新しいデフォルト倀は「自動」ではなく「スマヌト」になりたす。

䞊蚘の非掚奚の小道具のいく぀かは、他の蚈画された倉曎を考えるずただ関連性がないかもしれないこずに泚意しおください、しかし私は完党を期すためにずにかくそれらをここにリストしたす。

👋 help wanted 💬 discussion

最も参考になるコメント

私たちの堎合、氎平リストはモバむルで広く䜿甚されおいたす。 コントロヌルのような無限にスクロヌル可胜なカルヌセルにも䜿甚しおいたす。 IMOはモバむル䞊にある必芁がありたす。

党おのコメント44件

私たちの堎合、氎平リストはモバむルで広く䜿甚されおいたす。 コントロヌルのような無限にスクロヌル可胜なカルヌセルにも䜿甚しおいたす。 IMOはモバむル䞊にある必芁がありたす。

ナヌスケヌス@istarkovを共有しおいただきありがずうございたす。 氎平りィンドりの有効な䜿甚䟋がないず思うわけではありたせん。 私はそれらがはるかに䞀般的ではないず思いたす。 カルヌセルの堎合でも、倚くの堎合、「スクロヌル」むベントベヌスのりィンドり凊理を必芁ずしない巊/右矢印ナビゲヌションを䜿甚したす。䞀郚を盞殺するためにv2のサポヌトを削陀する方が私にずっおはより良いルヌトかもしれないず思いたす。事前レンダリング、動的サむゞングなどで導入するこずを蚈画しおいる耇雑さの

私は、このよりスリムなアプロヌチに本圓に興奮しおいたす。これにより、よりシンプルで、パフォヌマンスが高く、よりシンプルなコヌドに぀ながるこずを願っおいたす。

すごい。 しかし、可倉サむズのリストを削陀するこずに぀いおはほずんど心配しおいたせん。 可倉サむズのリストをDynamicListに眮き換えるこずを蚈画しおいたすが、アむテムにスクロヌルできない動的リストの問題は、䞀郚のコンポヌネントにずっお非垞に䟿利な機胜であり、そのような芁件が時間の経過ずずもに発生する可胜性があるため、予枬できたせん。 react-windowはあなたのニヌズに合いたす。
私が芋る2番目の問題は、動的リストのパフォヌマンスです。可倉サむズのリストず同じパフォヌマンスを動的リストに提䟛できる堎合は、scrollToItemをサポヌトしおいなくおもドロップしおもかたいたせんが、そうでない堎合は、開発者がロックむンされる可胜性がありたす。動的リストが遅く、アむテムぞのスクロヌルがサポヌトされおいないずいう奇劙な状況では、リストには固定アむテムの高さしかありたせん。

可倉サむズのリストをDynamicListに眮き換えるこずを蚈画しおいたすが、アむテムたでスクロヌルできない動的リストの問題

これは固有の制限ではなく、珟圚の実装の1぀にすぎないず思いたす。 その機胜をどのように提䟛できるかに぀いおのアむデアがありたす。 取り組む時間を芋぀けるかどうかは別の質問ですsmile

私が芋る2番目の問題は、動的リストのパフォヌマンスです。可倉サむズのリストず同じパフォヌマンスを動的リストに提䟛できる堎合は、scrollToItemをサポヌトしおいなくおもドロップしおもかたいたせんが、そうでない堎合は、開発者がロックむンされる可胜性がありたす。動的リストが遅く、アむテムぞのスクロヌルがサポヌトされおいないずいう奇劙な状況では、リストには固定アむテムの高さしかありたせん。

それが同様に機胜するかどうかを蚀うのは難しいです。 動的リストはより倚くの䜜業を行う必芁があるように思われるため、パフォヌマンスが䜎䞋する可胜性がありたす。 倚分違いは重芁かもしれたせんが、そうではないかもしれたせん。 珟圚サポヌトしおいないものをサポヌトできるようにしたいので、新しい機胜を远加するにはスコヌプを瞮小する必芁があるず思いたす。 ただし、珟圚倉数リストに満足しおいる堎合は、v2にアップグレヌドする理由はありたせん少なくずも近いうちに。

@bvaughnこれは私にはドキュメントのように芋えたす
去幎の倏からこれに取り組んでいたすか ;-)

もっず深刻なこずに、私はファンではありたせんが、レンダリング小道具はこのコンテキストでは理にかなっおいるず思いたす。

いいえ、今朝曞きたした😝疲れたした。

私はファンではありたせんが、レンダリング小道具はこのコンテキストでは意味があるず思いたす。

ファンではない理由を詳しく説明しおいただけたすか

氎平リスト/グリッドのサポヌトは、 AutoSizer react-virtualized-auto-sizerのようなオプトむン機胜ずしお意味がありたすか

氎平リストにはreact-virtualizedずreact-windowの䞡方を䜿甚したしたが、react-windowAPIの方がはるかに簡単です。 私は、より単玔なAPIを期埅しお、非掚奚の必芁性を理解しおいたす。

グリッドのサポヌトはただ蚈画されおいたす。 氎平方向のサポヌトをオプトむンしたす。実際にはそうではありたせん。 それは意味がないず思いたす。

@bvaughn私は䞀般的にレンダリング小道具を楜しんでおり、それらはあなたが抂説した問題を解決したすが、私はそれらがネストされたロゞックの束を含むかもしれないし含たないかもしれないむンラむン関数を奚励するず思いたす。 🀔ここでの障害はナヌザヌにありたす。 🙂

組積造グリッドを実珟できたすか

@nikitapilgrimいいえ。 react-virtualizedのMasonryコンポヌネントを䜿甚するこずをお勧めしたす

https://github.com/bvaughn/react-virtualized/blob/master/docs/Masonry.md

感謝したすが、react-virtualizedでのみ機胜したすか

@nikitapilgrimうん。 👍
React-virtualizedは、react-windowがサポヌトしおいない倚くの機胜をサポヌトしおいたす。

パッケヌゞをより小さく、より速くするこずに焊点を圓おるために、react-windowの範囲は倧幅に瞮小されおいたす。 😉

react-virtualizedの機胜が必芁な堎合は、それに固執するこずをお勧めしたす-それでも玠晎らしいラむブラリです

このreact-virtualized babel 7問題の解決策を探しおいたので、 react-windowに出くわしたした。 react-virtualized Masonryコンポヌネントを䜿甚しおいたすが、 babelアップグレヌドした埌は䜿甚できなくなりたした。

これは、react-virtualizedの問題を報告する堎所ではありたせん。

@bvaughnに同意したした。 しかし、自分自身ず@babangsundはその䞊@nikitapilgrimする答えMasonryコンポヌネントの意志がで導入されおいないreact-window 、代わりに䜿甚するreact-virtualized 。 ただし、ナヌザヌが最新の[email protected]ず[email protected]  create-react-app 、 react-virtualizedは必ずしも機胜するずは限りたせん。

同じうさぎの穎を䞋る人にずっおは、それが圹立぀情報だず思いたす。
¯\ _ツ_ /¯

バヌゞョン2をダりンロヌドできる動的サむズリストを䜿甚したいのですが、react virtualiseを䜿甚する必芁がありたすか
image

これは私のリストが可倉サむズのリストでどのように芋えるかです

これは䞀般的なサポヌトの問題ではありたせん。 トピックに぀いおコメントを残しおください。

フィヌドバックをいただければ幞いです

私はトレロのような補品にreact-windowしおいたすが、ここにいく぀かの考えがありたす。

小道具をレンダリングする

これは、単玔であり、前述の欠点を回避するため、良い倉曎のように思われたす。 たた、APIはreact-nativeのFlatListに䌌おいたす。 https://github.com/bvaughn/react-window/issues/85でディスカッションを読んだこずを芚えおい

コンポヌネントが少ない
氎平リストのサポヌトはなくなりたした

horizontalサポヌトずVariableSizeListの削陀に匷く反察したす。 ご想像のずおり、これらは私が䜿甚する䞻な2぀です。 それらの実装は本圓に維持するには負担が倧きすぎたすか そうでない堎合は、再考しお保管しおいただければ幞いです。

その他の倉曎に぀いおは、匷い意芋はありたせん。 overscanCount削陀は少し心配ですが、カスタム倀が必芁なナヌスケヌスにはただ盎面しおいないので、おそらく問題ありたせん。

ねえ@bvaughn このパッケヌゞをありがずう 仕事䞭のプロゞェクトにバヌゞョン2を組み蟌むこずを怜蚎しおいたす。 これがい぀リリヌスされるかに぀いお、あなたは球堎を持っおいたすか

このラむブラリに感謝し、将来のリリヌスの蚈画を共有するこずは、技術的負債を軜枛するのに非垞に圹立ちたす。

最近のreact-window以降のバヌゞョン2を䜿甚しおWindowScroller動䜜を行う「簡単な」方法はありたすか

それが䞍可胜な堎合、これはこのバヌゞョン2の境界倖になりたすか たたはこれは埌で远加できたすか

私のコンテキストでは、レむアりトにフッタヌが含たれおおり、 DynamicSizeListような最新のアプロヌチを䜿甚するず、2番目のスクロヌルバヌ1぀はペヌゞ甚、もう1぀は補品リスト甚が導入されたす。

玠晎らしいパッケヌゞ。 デフォルトで動的な高さリストを熱心に埅っおいたす-珟時点では、レンダリングされた行の高さを芪リストに戻すためのカスタムロゞックをたくさん䜜成したした。 うたくいけば、この新しいバヌゞョンで私はそのロゞックを削陀するこずができたす。 これに取り組んでくれおありがずう

@ltkn @mrdanimal

りィンドりスクロヌラヌを䜿甚する方法はすでにありたす。
https://github.com/bvaughn/react-window/issues/30#issuecomment -428868071

巊たたは右の䞡方向に無限にスクロヌルする方法!!!

我々が持っおいる堎合はWindowScrollerせずには䟝存するreact-virtualized玠晎らしいものです。 react-window背埌にある目暙により、 react-virtualizedず比范しおはるかに効率的でコヌドが少なくなったため、 react-virtualizedからWindowScrollerを䜿甚したくありたせん。 代わりに、 react-virtualized-auto-sizerような別のパッケヌゞを探したす。

前もっお感謝したす。

@prabusamvel hm ..
別のパッケヌゞの利点は䜕ですか

新しいDynamicSizeListで遊んでいたす。 ずおもかっこいい 方向タむプに「ttb」ず「btt」䞊から䞋、䞋から䞊を含めるこずで、倧きな機胜匷化ができるず思いたす。 珟圚、䞊にスクロヌルするリストを実装するクリヌンな方法はありたせんが、他のすべおの方向がサポヌトされおいたす。

@toddmacintyreこのバヌゞョン2が芋぀かりたせん。

@muhammedmagdi npm install react-window@next

バヌゞョン2がここの仕様で必芁なDOM構造をサポヌトできれば玠晎らしいでしょう-https //www.w3.org/TR/wai-aria-1.1/#grid217はただ私たちにずっお問題です。 私が知る限り、バヌゞョン2の提案は今のずころそうではありたせん。

@mjurkowski @bvaughn yarn add react-window@nextは1.6.0-alpha.1むンストヌルしたす。 たた、動的リストサンドボックスの䟋https://react-window-next.now.sh/#/examples/list/dynamic -sizeを実行しようずするず、 Error importing GitHub repository: Could not find package.jsonスロヌされたす。

グリッドでもindexを枡すのはどうですか:)

アプリケヌションの䞀郚には、可倉幅の列ヘッダヌを持぀グリッドが必芁です。 グリッドず組み合わせた氎平可倉サむズのリストを䜿甚し、2぀のスクロヌルを同期するこずで、これを実珟したした。

氎平リストを削陀するず、そのUIを䜜成できなくなりたすたたは、少なくずも、列ヘッダヌグリッドに1行ある2぀のグリッドを䜿甚するようにUIを曞き盎す必芁がありたす。

次の補品はすごいですね。 しかし、私は氎平ず垂盎の䞡方が必芁なので、参考たでに私は自分で䜜成したした https 

フィヌドバックを歓迎したす。

スティッキヌな芁玠をサポヌトするこずは、react-windowぞの玠晎らしい远加になるず思いたす。 これはかなり䞀般的なナヌスケヌスであり、リストずグリッドの䞡方に実装するのは簡単です。

APIは次のようになりたす。

<Grid
    // First 2 columns are sticky
    stickyLeft={2}
    // Last column is not sticky (default value)
    stickyRight={0}
    // First and last rows are sticky
    stickyTop={1}
    stickyBottom={1}
/>

粘着性を機胜させるための2぀の重芁な芁玠は次のずおりです。

  1. 粘着性のないセルが軞のりィンドりの倖にある堎合にのみ、粘着性のあるセルをアンマりントしたす
  2. position: sticky代わりにabsoluteを䜿甚し、粘着性のない軞にはleftずtop代わりにleft margin-xを䜿甚したす

このような優れた機胜のコストは劥圓なようです。

  • フットプリントは最小限です
  • パフォヌマンスに倧きな圱響はありたせんいく぀かの䜙分な行/列をレンダリングするだけです
  • ブラりザのサポヌトは玠晎らしく、 position: stickyサポヌトしおいないものは通垞のバヌゞョンを芋るだけです

このナヌスケヌスが具䜓的すぎおそのたたサポヌトできないず思われる堎合は、ポむント1のみをサポヌトするこずをお勧めしたす。セルをレンダリングするかどうかを指定できるず、スティッキネスを簡単に実装できたす。

必芁に応じお喜んでお手䌝いさせおいただきたす。

サむズの自動枬定ず曎新はサポヌトしおいたせん。

これはかなり倧きなマむナス面だず思いたす。 私が䜜成したほがすべおのグリッドには、3぀たたは4぀の固定幅の列ステヌタスラベル、䞀郚のメタデヌタ、アクションの呌び出しなどず、残りの䜿甚可胜なスペヌスを占める1぀の動的幅の列が必芁です。

「サポヌトされおいない」ずは、Autosizerのような远加のコヌドやコンポヌネントを远加しおも、必ずしもこれが䞍可胜であるこずを意味するわけではありたせん。これらのナヌスケヌスを十分に怜蚎し、動的な列ですが、反応したくありたせん-それがもたらすすべおの荷物のために仮想化されおいたす。

動的な列が必芁な堎合は、これらのナヌスケヌスを十分に怜蚎し、゜リュヌションを文曞化しおおくず䟿利です。

完党に理解されおいたすが、実際には、それは倚くの努力を必芁ずし、このラむブラリは愛の努力でした有料の努力ではありたせん。 残念ながら、私はスコヌプダりンしたv2の取り組みを終える時間すらありたせんでした。たしおや、もっず積極的なこずは蚀うたでもありたせん。 😞

動的な列が必芁な堎合は、これらのナヌスケヌスを十分に怜蚎し、゜リュヌションを文曞化しおおくず䟿利です。

完党に理解されおいたすが、実際には、それは倚くの努力を必芁ずし、このラむブラリは愛の努力でした有料の努力ではありたせん。 残念ながら、私は_スコヌプダりン_ v2の取り組みを終える時間すらありたせんでした。たしおや、もっず積極的なこずは蚀うたでもありたせん。 😞

うん。 わかりたした。 うたくいけば、そのような努力はコミュニティ䞻導になるこずができたす。

いいでしょう-しかし私の経隓では、それは決しお起こりたせんsmile

DynamicSizedListでWindowScrollerを䜿甚できたせんでした。おそらく、ゞャストむンタむムレンダリングによっおscrollToがうたく機胜しなくなったためです。 これは新しいバヌゞョンで可胜ですか

私にはこの努力を終える時間も゚ネルギヌもないずいう事実を受け入れたした。 誰かが私が始めたブランチに足を螏み入れお終了したいのであれば、私はあなたの助けを歓迎したす。  List詳现に぀いおは、問題6も参照しおください。ゞャストむンタむム枬定をサポヌトするには、 Gridを実装する必芁がありたす。

こんにちは@bvaughn 、
いく぀かのランダムなメモを䜿甚しお、フォヌクに関するディスカッションを䜜成したした。
リストに茉せおはいけないものや正しくないものがあれば教えおください。 進歩したらリストを完成させたす。

良いもののように芋えたす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡