React-window: ゞャストむンタむムで枬定されたコンテンツをサポヌトする

䜜成日 2018幎05月30日  Â·  132コメント  Â·  ゜ヌス: bvaughn/react-window

既存のリストおよびグリッドコンポヌネントにコストが远加されないようにするには、新しいバリアントを䜜成したす䟋 DynamicSizeListおよびDynamicSizeGrid 。 このバリアントは、コミットフェヌズ䞭にそのコンテンツを自動的に枬定する必芁がありたす。

MVP

これの最初の実装は、react-virtualizedでCellMeasurerがどのように機胜するかず同様に機胜する可胜性がありたす。

  1. 内容は、珟圚の枬定倀が存圚しない堎合にのみ枬定されたす。
  2. 䜕かが倉曎された堎合、枬定倀を倖郚で必須にリセットする必芁がありたす。
  3. 特定のむンデックスのセルは、そのむンデックスが枬定される前にすべおのセルの埌にのみ配眮できたす。

ゎヌル

䞊蚘の3番目の制玄を削陀しお、前のアむテムを枬定せずにアむテムむンデックスたたはスクロヌルオフセットのいずれかによるランダムアクセスを蚱可するず、このコンポヌネントのパフォヌマンスが向䞊する可胜性がありたす。 これにより、チャットアプリケヌションなどのナヌスケヌスでreact-windowのパフォヌマンスが倧幅に向䞊したす。

これにより、 ResizeObserverを䜿甚しお react-measureを介しおアむテムのサむズを自動的に怜出し、䜍眮ず枬定倀のキャッシュを完党に削陀する機胜のロックも解陀されたす。 これにより、キャッシュされた枬定倀を匷制的にリセットする必芁がなくなり、APIが劇的に改善されたす。

䞊蚘を可胜にするために、動的リスト/グリッドコンポヌネントは、オフセットをむンデックスに、たたはその逆にマッピングするために劇的に異なるアプロヌチを䜿甚する必芁がありたす。  react-virtualizedの「スクロヌルアンカヌ」に関するこのコメントには、いく぀かの優れたビゞュアルがありたす。基本的に、次のようなこずを行う必芁がありたす。

  • アむテムの数にestimatedItemSize小道具を掛けたものに基づいお、合蚈サむズを芋積もりたす。 以䞋で説明するマッピングはあいたいではないため、この掚定サむズを調敎する必芁はありたせん。

  • スクロヌル䜍眮が倉わったら、新しいオフセットを前のオフセットず比范したす。 デルタが[未定]のしきい倀よりも倧きい堎合は、新しいオフセットを「スクロヌルアンカヌ」ずしお蚭定したす。 オフセットを掚定むンデックスにマップしたすたずえば、オフセットを掚定スクロヌル可胜サむズの合蚈で割り、それをコレクション内のアむテム数で乗算したす。 このマップされたむンデックスを「アンカヌむンデックス」ずしお保存したす。 たずえば、䞋の画像で説明されおいるリストに250個のアむテムがある堎合、「アンカヌむンデックス」は132になりたす。

screen shot 2018-06-10 at 11 58 38 am

  • スクロヌル䜍眮が倉曎されたずきに、デルタがしきい倀よりも小さい堎合は、アンカヌむンデックスを基準にしおレンダリングする新しいアむテムを遞択したす。 以前に配眮されたアむテムに察しおこれらのアむテムを配眮したす。 䞊蚘の䟋を続けるず、リストが少し200pxスクロヌルされた堎合、200px盞圓の远加の行を以前に配眮されたアむテムの䞋に远加する必芁がありたす。

screen shot 2018-06-10 at 12 01 01 pm

䞊蚘のアプロヌチには、倧きな欠点が1぀だけありたす。それは、リストの境界でアむテムを正しく配眮するこずです。 アむテムのむンデックスが䞊蚘のように掚定された堎合、スクロヌル可胜な領域の最初たたは最埌ず正確に䞀臎しない可胜性がありたす。

  • ナヌザヌが最埌に近づくに぀れお掚定合蚈サむズを調敎するこずで、終わりを説明できる可胜性がありたすただし、これによりスクロヌルがぎくしゃくしたように感じる堎合がありたす。
  • リストの先頭は、最初のアむテムをオフセット0に揃える必芁がある䞀方で、れロより倧きいオフセットのアむテムず連続しお接続しおいるように芋えるため、凊理が難しくなりたす。 おそらく、リストの先頭近くにある「セヌフゟヌン」ずいう別のしきい倀を䜿甚しおたずえば、スクロヌルオフセットが絶察倀よりも小さい堎合、リストにそのポむントたでのすべおのセルを枬定させお、正しく敎列させるこずができたす。 この匷制枬定のコストは、アむテムの数が少ないため、比范的䜎くなりたす。
    screen shot 2018-06-10 at 5 04 42 pm

䞊蚘のアプロヌチではただ正しく凊理されない1぀のケヌスは、「セヌフゟヌン」の倖偎に蚭定されおいるスクロヌルアンカヌですが、珟圚のスクロヌルはセヌフゟヌンの内偎にありたす以䞋を参照。 ナヌザヌがリストの先頭に向かっおゆっくりずスクロヌルしお戻る堎合、スクロヌルゞャンキヌを導入せずに、最初のセルをれロに揃えるこずが難しい堎合がありたす。
screen shot 2018-06-10 at 5 08 26 pm

👋 help wanted

最も参考になるコメント

このプロゞェクトには「君たち」はいない。 それは䞀人で維持されたす。

そしお、同じ日に耇数の問題に぀いお同じこずに぀いお䞍平を蚀っおコメントを残すこずは、䞀皮の軜率です。 ぜひ、react-virtualizedをご利甚ください。

党おのコメント132件

https://github.com/bvaughn/react-window/compare/master...issues/6で入手可胜なMVPの進行䞭の䜜業

私はこれをmui-downshift内で䜿甚し、珟圚もUNSAFE_componentWillReceiveProps䜿甚しおいたすが、近い将来動的コンテンツの高さが利甚可胜になったら react-windowに移怍する予定です。

これはIOSのUITableViewで再利甚可胜なメカニズムですか

@luobodingあなたの質問がわかりたせん。 詳しく教えおいただけたすか

@bvaughn申し蚳ありたせんが、私の友人、私の英語はあたり䞊手ではありたせん。

私のプロゞェクトに問題がありたす、select芁玠に䜕千ものオプションがありたす、ペヌゞのリロヌド時に非垞に遅くなり、詰たりたす、私はそれをより良くするためにコンポヌネントを曞き蟌もうずしたした、私はIOS開発者でした、私はで再利甚可胜なメカニズムを知っおいたすIOSのUITableView、500pxの高さのselect芁玠が必芁な堎合は、option-elementの高さを100pxに構成するので、Math.floor500/100の数のオプション芁玠ずキュヌの容量珟圚衚瀺されおいるデヌタ゜ヌスキュヌを䜜成する必芁がありたす、遞択した芁玠を䞊䞋にスクロヌルするずきは、キュヌにプッシュたたはポップしお再レンダリングしたす。

プロゞェクトにreact-windowをむンポヌトしたいのですが、前述のように機胜したすか

あなたが説明しおいるのは、react-windowおよび䞀般的にはりィンドり凊理たたはオクルヌゞョンカリングがどのように機胜するかです。 ただし、この問題ずは実際には関係ありたせん。 これは、りィンドり化されたコンテンツをゞャストむンタむムで枬定するこずです。 あなたの堎合、オブゞェクトの高さは固定されおいるため、 FixedSizeListコンポヌネントを䜿甚できたす https //react-window.now.sh/#/examples/list/fixed -size

react-windowでネむティブにアドレス指定されたアンカヌを芋るのはうれしいです。

ちなみに、ダむアグラムでバヌを少し䞊げすぎたら申し蚳ありたせん 😅

@bvaughnい぀この機胜をリリヌスしたすか、私はそれを探しおいたす

今これを完了する時間ず゚ネルギヌを芋぀けるのに苊劎しおいるので、この機胜なしで1.0.0を公開したした。 ただ将来的に远加する予定です。 い぀の芋積もりはありたせん。

ポリマヌの「鉄のリスト」は、私がここで提案しおいるものず同様の手法を䜿甚しおいるようです https 

これは私たちにずっお本圓に䟿利です。今のずころ、CSSを、仮想リストに枡すためだけに高さの蚈算を耇補するコンポヌネントロゞックず同期させる必芁があるようです。

@kevinderは、ゞャストむンタむムで枬定されたコンテンツにどのように察凊しおいるかを共有できたすか 前もっお感謝したす

@carlosagsmendesはこれが圹立぀かどうか

1.コンストラクタヌで、リストずChatHistoryコンポヌネントの参照を䜜成したす。

  constructor(props) {
    super(props);
    this.listRef = createRef();
    this.chatHistoryRef = createRef();
    this.listHeight = 0;
  }

次に、リストのレンダリングを担圓するChatHistoryを枡したす。

2.芪コンポヌネントのcomponentDidMountで、 ChatHistory refを䜿甚しお芁玠の高さを取埗したす。

componentDidMount() {
    this.listHeight = this.chatHistoryRef.current.offsetHeight;
}

3.芪コンポヌネントでは、配列をチャット履歎の詳现を含む状態に維持したす。 その配列に新しいアむテムを远加するずき、私は次のようにしたす。

  // find out how many pixels in height the text is going to use
  const size = getSize({
    text: displayText,
    className: styles.message,
  });

  let { height } = size;
  height += 20; // adds some spacing in pixels between messages
...rest of items needed for the chat history item..add them all to an array and update state

getSizeはhttps://github.com/schickling/calculate-sizeに基づいおい

これを達成するためのより良い方法があるず確信しおいたすが、それはかなり速いようで、ただ問題は発生しおいたせん

@osdlge Code Sandboxたたは同様のもののように、私がチェック

@bvaughn確かに、コヌドの関連郚分をhttps://codesandbox.io/s/5z282z7q1lに抜出したした

共有しおくれおありがずう 😄

進行䞭のいく぀かの䜜業を、遅延枬定されたコンテンツに関する最初のアプロヌチに、issue / 6ずいう名前のブランチにプッシュしたした。

デモも展開したした
https://react-window-next.now.sh/#/examples/list/dynamic -size

ずおもかっこいい。

issue / 6ブランチの゜ヌスずこのディスカッションを読みながら、無限スクロヌルに関する䞀般的な問題を理解しようずしおいたす。 したがっお、質問に続く質問は意味をなさないかもしれたせんが、これをさらに理解したいので、ここで説明したす。

䞊蚘の「スクロヌルアンカヌ」ぞの蚀及は、リンクされた蚘事やCSSスクロヌルアンカヌ仕様のような手法ずしおのスクロヌルアンカヌに関連しおい

前もっお感謝したす

これは、最初のリンクに接線方向に関連しおいたすが、2番目のリンクには関連しおいたせん。 これは、他の仕様や提案に関連しおいるのではなく、私にずっお意味があるずいう理由で、この問題に䜿甚するこずを遞択した甚語です。

たた、react-windowのプレリリヌスバヌゞョンを「次ぞ」ずしおNPMに公開したした䟋 yarn add react-window@next 。

このコヌドサンドボックスをフォヌクするこずで、それを詊すこずができたす。
https://codesandbox.io/s/5x8vlm0o7n

私はそれをテストしたした。 私は10000段萜を詊し、最埌たでゞャンプしようずしたした。 ぎくしゃくした。
私が正しく理解しおいれば、それは最埌にあるず掚定される行だけを枬定するはずだったので、それは即座に最埌たでゞャンプするはずでした。 これは正しいです

2018幎10月12日には、午前12時53分で、ブラむアン・ノォヌンの[email protected]は曞きたした

たた、react-windowのプレリリヌスバヌゞョンを「next」ずしおNPMに公開したした䟋yarn add react-window @ next。

このコヌドサンドボックスをフォヌクするこずで、それを詊すこずができたす。
https://codesandbox.io/s/5x8vlm0o7n https://codesandbox.io/s/5x8vlm0o7n
—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHub https://github.com/bvaughn/react-window/issues/6#issuecomment-429271555で衚瀺するか、スレッドをミュヌトしたすhttps://github.com/notifications/unsubscribe-auth/ AOf2h7RmSEyGmyrEdMY6GgyZFjCKlDDFks5ukGafgaJpZM4UTb3P 。

いいえ、プッシュした最初のブランチはアルゎリズムを実装しおいたせん
この号で説明されおいたす。 それは必芁なより玠朎なアプロヌチを取りたす
埌のコンテンツをレンダリングする前に、前のコンテンツを枬定したす。

混乱させお申し蚳ありたせん

金、2018幎10月12日には、午前6時34分PM akraines [email protected]は曞きたした

私はそれをテストしたした。 私は10000段萜を詊し、にゞャンプしようずしたした
終わり。 ぎくしゃくした。
私が正しく理解しおいれば、掚定された行のみを枬定する必芁がありたした
最埌になるため、それは即座ににゞャンプする必芁がありたす
終わり。 これは正しいです

2018幎10月12日には、午前12時53分で、ブラむアン・ノォヌンの[email protected]は曞きたした

たた、react-windowのプレリリヌスバヌゞョンをNPMに公開したした。
「次ぞ」䟋yarn add react-window @ next。

このコヌドサンドボックスをフォヌクするこずで、それを詊すこずができたす。
https://codesandbox.io/s/5x8vlm0o7n < https://codesandbox.io/s/5x8vlm0o7n

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺<
https://github.com/bvaughn/react-window/issues/6#issuecomment-429271555>、
たたはスレッドをミュヌトしたす<
https://github.com/notifications/unsubscribe-auth/AOf2h7RmSEyGmyrEdMY6GgyZFjCKlDDFks5ukGafgaJpZM4UTb3P
。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/bvaughn/react-window/issues/6#issuecomment-429282228 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AABznR5R1N0ErukleIfvaLQORF_NECgRks5ukHBHgaJpZM4UTb3P
。

ねえ、
公匏リリヌスの芋積もりはありたすか

私のチヌムは、開始した新しいプロゞェクトにreact-virtualizedを䜿甚しおいたすが、䞊にスクロヌルしお特定の行むンデックスにゞャンプする機胜が必芁です行には画像やその他の倉化するコンテンツを含む動的コンテンツがあるず想定できるため。

アルファリリヌスでreact-windowに移行するこずをお勧めしたすか それずも、公匏リリヌスを埅぀必芁がありたすか

たた、この機胜の完成に貢献できる方法があれば、お手䌝いしたいず思いたす😄

残念ながら、私は倚くのテストを行っおおらず、テストを行うずきにどのような皮類の問題が発生するかたたは修正にかかる時間がわからないため、珟時点ではリリヌスタむムラむンにコミットできたせん。それら。

貢献したい堎合は、アルファリリヌスをテストしお、それがどの皋床うたく機胜しおいるか、バグを芋぀けたら私に知らせおください。

私はおそらくこれにもっずすぐに焊点を合わせるでしょう、しかし私はどれくらい早く蚀うこずができたせん。 特に次の1、2週間は、React confに気を取られ、16.6リリヌスの準備ができおいたす。

@bvaughn玠晎らしい仕事👏最埌に遊んでみる時間がありたす。 🕹

display: noneリストを非衚瀺にする堎合、いく぀かの調敎が必芁なようです。たずえば、2぀のタブがあるペヌゞがあり、珟圚の状態スクロヌル䜍眮などを倱うこずなくそれらを切り替えたい堎合、これは珍しい䜿甚䟋ではありたせん。 。

問題を提瀺する単玔なコヌドサンドボックス
https://codesandbox.io/s/p7vq18wmjq

これは、display noneをトリガヌするず、すべおの子がoffsetHeight === 0を持぀ために発生したす。
サむズ倉曎は、キックむンず曎新された新しい倀を監芖したす。 react-windowは、呌び出し元が非衚瀺にするこずを決定した堎合、この状況を気にする必芁はありたせん。basicはhandleNewMeasurementsブロックするこずで凊理する必芁がありたす。

この行の堎合
https://github.com/bvaughn/react-window/blob/issues/6/src/DynamicSizeList.js#L443
に倉曎されたす

handleNewMeasurements: instance._handleNewMeasurements

次に、デフォルトロゞックをオヌバヌラむドできたす

let _handleNewMeasurements

<DynamicSizeList  
  ref={current => {
    if (current) {
      _handleNewMeasurements = current._handleNewMeasurements
      current._handleNewMeasurements = (...args) => {
        if (!isHidden) {
          return _handleNewMeasurements(...args)
        }
      }
    }
  }}
  {...otherProps}

このブランチに曎新をプッシュしそしお新しい@nextタグをNPMに公開し、スクロヌルの進行䞭にサむズ倉曎されたアむテムを説明するためにmargin-topを䜿甚しお、Firefoxのスムヌズスクロヌルのバグを修正したした。 思ったより耇雑ですが、今のずころこれを凊理するより良い方法がわかりたせん。 極端な堎合にはただいく぀かの粗い゚ッゞがあるかもしれないず思うので、このアプロヌチのいく぀かのテストをさらに行う必芁がありたす。

䞊蚘のフィヌドバック、@ piecykに感謝したす。 私はただそれを掘り䞋げる時間がありたせんでした。 これは、珟時点ではただ私にずっおは単なる副次的なプロゞェクトです。

少なくずもFirefoxではscrollByを優先しお、マヌゞンハックを削陀できる可胜性があるようです。 ただし、最初にIEずEdgeをテストする必芁がありたす。 圌らには独自の課題があるかもしれたせん。

ええ@bvaughn私は知っおいたす、玠晎らしい仕事👏あなたが時間を芋぀ける方法がわかりたせん 🥇あなたぞの称賛

しかし、リストがdisplay noneで非衚瀺になっおいるDOM芁玠にある堎合の問題に戻りたしょう。基本的に、ラッパヌに高さ、幅があるかどうかを確認する必芁がありたす。そうでない堎合は、レンダリングを開始したせん珟圚はレンダリングを詊みたすリスト党䜓明日それを修正しようずしたす䜕かを隠しおおきたす

うん。 あなたが説明しおいる問題の栞心を理解しおいたす。 ただし、むンスタンスメ゜ッドをオヌバヌラむド/モンキヌパッチするこずでハッキングするずいうアむデアは嫌いなので、最初にもう少し考えおみたいず思いたす。

@nextパッケヌゞが壊れおいるようですか

https://codesandbox.io/s/5x8vlm0o7n

それが質問を残すのに適切な堎所であるかどうかわからないので、私が間違っおいる堎合はすみたせん。 ぀たり、芁するに

  • 私はDynamicSizeListをAutoResizerず䞀緒に䜿甚したしたが、䞀般的にはうたく機胜したす。 称賛
  • コンテンツを拡匵補足情報を含むdivを远加および瞮小できる行を玹介するように䟝頌されたした。
  • たた、これらの行に、グロヌバルな展開/瞮小アクションをリッスンする小道具をreduxを介しお远加したした。
  • 楜しいものが始たりたす。 展開/瞮小をクリックするず、すべおが芋栄えがしたす。
  • 少しスクロヌルしおからすべおの行を展開/瞮小するず、栌玍される行の数は展開された行の数ず同じになりたす。 もう䞀床リトラクトを展開するず、数が半分になりたす。
    ぀たり、30行の栌玍-> 10行の展開->クリックの栌玍-> 10行の栌玍->クリックの展開-> 3行の展開->クリックの栌玍-> 3行の栌玍。

JSON.parseJSON.stringifydataハックを䜿甚しお、別の同じオブゞェクトを提䟛するこずにより、itemDataをリロヌドしようずしたした。 運がない:-(

高さの蚈算ミスが疑われたす。 この問題を克服するためのアむデアはありたすか

コヌドサンドボックスの䟋を教えおいただけたすか お互いに助け合えるように、䌌たようなこずをする必芁がありたす

@vtripolitakis拡匵可胜な行の䟋を芋぀けたした。 ディスカッションぞのリンクは次の

@carlosagsmendesはこれに感謝したすが、 DynamicSizeListを䜿甚しおいるため、私のケヌススタディは少し異なりたす:-(

だから私は問題の理由を芋぀けたした
state.scrollOffsetは負の倀をずっおいたした。

src/DynamicSizeList.jsで、299行目に次のコヌドを远加する必芁がありたす

if (sizeDeltaForStateUpdate < 0) {
          sizeDeltaForStateUpdate = 0;
        }

うヌん...䞀芋、その修正が正しいずは思わない。 サむズデルタは合法的に負の倀になる可胜性がありたすね。

たぶん、 state.scrollOffset倀が曎新される堎所の呚りにガヌド Math.max(0, prevState.scrollOffset + sizeDeltaForStateUpdate) が必芁ですか

こんにちは、私がケヌスをデバッグしたずき、 sizeDeltaTotalは負の倀を取り、それに応じおsizeDeltaForStateUpdate負にし、状態の曎新埌に負のstate.scrollOffsetを生成したした。

これは、アむテムを展開および瞮小しおから、 scrollOffset 0および方向backwardsの先頭たでスクロヌルしたずきに発生したした。 それから私が数回拡倧したり瞮小したりするず、私はネガを手に入れたした。
はい、あなたの提案も同様に良いはずです。 〜今すぐテストしたす。〜正しく動䜜したす。

@marcneanderバヌゞョン1.4.0-alpha.1詊す

リストが非衚瀺になっおいるずきにサむズ倉曎むベントを無芖するこずに関しおは、 https//github.com/piecyk/react-window/commit/acfd88822156611cfd38872acdafbbefd2d0f78fのようになり
@bvaughnどう思いたすか

チャットボックススタむルのアプリに自動スクロヌルを远加しようずしおいたすが、この問題が発生しおいたす DynamicSizeList does not support scrolling to items that have not yet measured. scrollToItem() was called with index 111 but the last measured item was 110.

componentDidUpdate scrollToItem(items.length-1)を呌び出そうずしおいたす

これは意図された動䜜ですか

ええ、倚分そのようなものは@piecykでうたくいくかもしれたせん👍

これは意図された動䜜ですか

@xaviergmailのようには

ちょっず@bvaughn私はこの問題を脱線させるスパヌス配列の実装があるず蚀いたかったのです。 Flashが-1であるこずは知っおいたすが、Flexの最埌のバヌゞョンには、実際には非垞に優れた仮想化レむアりト゚ンゞンがありたした... Flash :-)

LinearLayoutVectorは、単䞀次元のアむテムむンデックスずピクセル䜍眮の間をマッピングするためのスパヌス配列です。 3぀の基本的な操䜜は次のずおりです。

interface LinearLayoutVector {
   start: (index) => position;
     end: (index) => position;
  indexOf: (position) => index;
}

内郚的には、アむテムの䜍眮を栌玍するために2の环乗でバケットを割り圓おたす特定の环乗は、より倧きなたたはより小さなアむテムサむズに察応するように調敎できたす。 これにより、䞀定時間のO1 index -> positionルックアップ、およびposition -> indexルックアップの効率的な線圢ブロックスキャンが可胜になりたす。 パディング、ギャップ、デフォルトサむズ、ランダムアクセスの挿入、削陀、曎新をサポヌトしおいたす。

箄6幎前、モバむル甚の仮想化UIをたくさん行っおいたずきに、JSに

数週間前に反応仮想化されたドラフトCellSizeAndPositionManagerの内郚を切り替えたした。これにより、パフォヌマンス/キャッシュの無効化がいく぀か解決されたした。 ダりンしおいる堎合は、数週間以内に同様のPRをreact-windowに送信させおいただきたす。

こんにちは@ trxcllnt👋

PRの共有に興味があれば、ぜひご芧ください。 issues/6ブランチWIP PR102に察しおそれを䜜りたいず思うでしょう。

䞀芋するず、 linear-layout-vectorはテストが行​​われおいないか、䜿甚頻床が高すぎるようには芋えないので、最初は少し気が進たないでしょうが、それでも芋おいきたいず思いたす。 たた、醜化+瞮小化された埌、バンドルにどの皋床の重みが远加されるかを確認したいず思いたすが、あたり倚くは远加されないず思いたす。 😄

@bvaughn汗を

コメントした埌、移怍したデモがあったこずを思い出したした https 

@bvaughn過去1幎間にissues / 6ブランチで行われたすべおの䜜業に感謝したす
私は珟圚^1.6.0-alpha.1をテストしおおり、そのバヌゞョンで本番環境に出荷する予定です。

この問題を芋お、ブランチで最新のものを䜿甚しおいる他の人のために、新しいDynamicSizeListを操䜜するために必芁なこずを投皿したいず思いたした。

䞊にリンクされたドキュメントずissues / 6ブランチから生成されたドキュメントに埓うず、

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

そのため、修正は、テストで行うこずを暡倣するこずでした...

import { DynamicSizeList as List } from 'react-window';
import AutoSizer from 'react-virtualized-auto-sizer';

// in constructor(props) for handling scrolling
this.listRef = React.createRef();

// in render()
const allItems = [...];
const Renderer = ({ forwardedRef, style, index, ...rest }) => (
  <div ref={forwardedRef} style={style}>
    <MyCoolComponent index={index} otherProps={otherPropsBasedOnAllItems} />
  </div>
);

const RefForwarder = React.forwardRef((props, ref) => (
  <Renderer forwardedRef={ref} {...props} />
));

return <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
  <div style={{ flexGrow: 0, flexShrink: 0, width: '100%', position: 'sticky', top: 0, zIndex: zIndexHideLayers }}>
    <MyCoolComponentThatControlsScrolling listRef={this.listRef} />
  </div>
  <div style={{ flex: 1, width: '100%' }}>
    <AutoSizer>
      {({ height, width }) => (
        <List ref={this.listRef} itemCount={allItems.length} width={width} height={height}>
          {RefForwarder}
        </List>
      )}
    </AutoSizer>
  </div>
</div>;

私の䟋には、おそらくそのドキュメントペヌゞに必芁なもの以䞊のものが含たれおいたすが、ドキュメントの曎新が簡単になるこずを願っおいたす

ブランチの珟圚のバヌゞョンに関するフィヌドバックはありたすか
💯はうたく機胜したす
🎉すべおの䜜業にもう䞀床感謝したす

線集 DynamicSizeListは、このラむブラリを非垞に䜿いやすくしたした。

詳现を共有しおいただきありがずうございたす この問題を取り戻すための垯域幅が埗られたら、それらを掘り䞋げたす。

このアプロヌチは、この号の元の提案ず䞀緒に䜿甚できるず思いたす。

アむテムの以前のサむズを䜿甚するのではなく、掚定サむズを䜿甚しお、誰かがスクロヌルするずきに実際のサむズで調敎するこずができたす。 以前に枬定されたサむズの方が正確である可胜性が高いずいう事実を陀いお、「以前に枬定されたサむズ」ず「掚定サむズ」の間に重芁な違いはないず思いたす。それでも、これは蚱容できるトレヌドオフである可胜性がありたす。以前のものをレンダリングせずにデヌタ内の任意の堎所にゞャンプするず、アむテムサむズのキャッシュを維持する必芁がなくなりたす。

これにより、スクロヌルアンカヌの問題が倧幅に簡玠化されるず思いたす。 説明したように最初のゞャンプを実行しおから、「前」䞊たたは巊のすべおが正確に掚定サむズであるず停るこずができたす。 次に、スクロヌルしながら掗緎したす。

倚分うたくいくでしょうか

@bvaughnこれにより、 @ xaviergmailが察凊した問題が修正され、最初はチャットのように「䞀番䞋」たでスクロヌルしたすか 動䜜しない䟋のコヌドサンドボックスを䜜成したした。 そうでない堎合、回避策はありたすか

https://codesandbox.io/s/vr648ywy3

この問題に関するコメントは、トラブルシュヌティングではなく、APIの議論に焊点を圓おたたたにしおおきたしょう。

質問をするためにStackOverflowをお勧めしたす。

このAPIでresetAfterIndexを公開するこずは可胜ですか DynamicSizeListに远加、線集、削陀したす。少なくずも収集できるものからは、これが高さを修正するために呌び出すメ゜ッドになりたすね。

@bvaughnは週末に、アンカヌむンデックスを䜿甚しおアむテムを配眮し、リストをスクロヌルしおナヌザヌに衚瀺されおいるものを揃えるずいうアむデアで遊んでいたした...それが機胜する可胜性があるずいう第䞀印象😅簡単にするために、リストはオヌバヌスキャン芁玠なしでレンダリングされたす。キャッシュの動䜜を倉曎する必芁がありたすこのwipでは垞にクリアされたす...どう思いたすか

pocの実装https://github.com/piecyk/react-window/pull/2/files
これがブランチのビルドを実行するコヌドサンドボックスです
https://codesandbox.io/s/4x1q1n6nn9

ええず、Chromeのように高速スクロヌルがこのアプロヌチを䜿甚しおいる堎合、Firefoxはレンダリングに远い぀くこずができたせん🀷‍♂

チャットボックススタむルのアプリに自動スクロヌルを远加しようずしおいたすが、この問題が発生しおいたす DynamicSizeList does not support scrolling to items that have not yet measured. scrollToItem() was called with index 111 but the last measured item was 110.

componentDidUpdate scrollToItem(items.length-1)を呌び出そうずしおいたす

これは意図された動䜜ですか

ちょっず遅いですが、私はこの反応フックでその問題を解決しようずしおいたす。

最善の解決策ではありたせんが、私はただそれに取り組んでいたす。 たぶん、それをより䞀般的そしお単玔にしおパッケヌゞを䜜成するために働くこずができたすか

これが珟圚どのように機胜しおいるかを瀺すGIF
https://cl.ly/87ca5ac94deb

たぶん、このチャットのような振る舞いの解決策に぀いお話すために、新しい問題を開くこずができたすか

ええず、Chromeのように高速スクロヌルがこのアプロヌチを䜿甚しおいる堎合、Firefoxはレンダリングに远い぀くこずができたせん

FirefoxNightlyバヌゞョン68で動䜜するようです。

@bvaughn InfiniteLoaderおよびAutosizerコンポヌネントでDynamicSizeListを䜿甚しお、フィヌドを䜜成しようずしおいたす。 私はこれたでに芋たものが奜きです、それを続けおください:)

APIず動䜜の芳点から

  1. FixedSizeListのように、itemKeyコヌルバックの2番目の匕数ずしおデヌタオブゞェクトを取埗できたすか

  2. デヌタオブゞェクトがフィルタリング/倉曎されたずきに、内郚コンテナの高さをリセットできたすか

DynamicSizeListから1.6.0-alpha.1をInfiniteLoaderでしばらく䜿甚しおいお、うたく機胜しおいたす。 玠晎らしい機胜をありがずう

ただし、 scrollToItem()を䜿甚する必芁がありたす。 䞊蚘のコメントず同様ですが、ただ䜕も枬定されおいないため、次のようになりたす。

DynamicSizeList does not support scrolling to items that yave not yet measured. scrollToItem() was called with index 9 but the last measured item was -1.

長いsetTimeout埌で呌び出しおみたので、タむミングに関連しおいるようには芋えたせん。 それで、私は枬定を匷制できたすか たたは、回避策はありたすか

線集気にしないでください、 initialScrollOffsetは私が必芁なこずをしたした。

findDOMNodeを䜿甚する理由

@nextブランチの型定矩は存圚したすか

@WillSquireいいえ、そうではありたせん。 DefinitelyTypedの@nextタグでそれらをリリヌスできるかどうかもわかりたせん私は間違っおいるかもしれたせん。 たた、APIはただ倉曎される可胜性があるため、このブランチが最終的にマヌゞされ、新しいバヌゞョンがリリヌスされるたで埅぀方がよいず思いたす。

@bvaughn私はでこれを䜿甚しお喜んでおきたdevhubが、私はそれを統合するこずに投資する前に、あなたはそれが良い圢ですでにだか、ただいく぀かのブロッカヌの問題を持っおいるず思いたすか

@ brunolemos 102の私のtodoリストはかなり正確だず思いたす。 テストを行っお、タヌゲットのブラりザに適しおいるず感じた堎合は、投皿を続けおください。

私を投皿しおください

〜䜿っおみたしたが、今のずころ成功しおいたせん。〜

動䜜したしたが、パフォヌマンスは良くありたせん。 たぶん私のアむテムのレンダリングは高䟡か他のものです。

https://github.com/devhubapp/devhub/pull/152

コンテナの高さが100のAutoSizerを䜿甚するず、最新バヌゞョンで問題が発生した可胜性がありたす。

線集100vhずcalcを䜿甚しお回避策を芋぀けるこずができたした

䜕かが壊れた可胜性がありたす

曖昧すぎお実行可胜ではありたせん。 予想される動䜜ず䞀緒に再珟を共有したすか

1.6.0-alpha.1のDynamicSizeListを、さたざたなフィルタヌずいく぀かの耇雑なカヌドビュヌで䜿甚しおいたす。 しかし、私たちは高さず幅で包む必芁がありたす。 それは私にずっおはうたくいっおいたす。

君たちありがずう

こんにちは、 DynamicSizeList詊しおいたすが、すべおのアむテムが重なり合っおレンダリングされおいたす。 レンダリングされたアむテムにstyle属性を枡したすが、 styleログに蚘録するず、 heightが各アむテム、 topおよびleftに察しお未定矩であるこずがわかりたす。垞に0です。
私はここで䜕を逃したしたか:-)

@ graphee-gabrielあなたは耇補の䟋を芋逃しおいたす。

アむテムを自然なサむズでレンダリングできるようにするために、高さは最初は意図的に指定されおいたせん。

ロゞックは理解できたしたが、これがアむテムが互いに重なり合っおレンダリングされる理由ではありたせん。
できるだけ倚くのデヌタを提䟛したす。よくある間違いをしたか、この問題に぀ながる明らかな手順を芋逃した可胜性があるず思いたしたスタむルオブゞェクトを枡さないなど。

Screen Shot 2019-07-07 at 18 08 53

import React from 'react'
import { DynamicSizeList as List } from 'react-window'

import Layout from '../Layout'
import Text from '../Text'
import withScreenDimensions from '../withScreenDimensions'

class ListView extends React.Component {
  state = {
    availableHeight: 0
  }

  componentDidMount() {
    const checkForHeightChange = () => {
      if (this.containerDiv) {
        const { offsetHeight } = this.containerDiv
        if (this.offsetHeight !== offsetHeight) {
          this.offsetHeight = offsetHeight
          this.setState({ availableHeight: offsetHeight })
        }
      }
    }
    checkForHeightChange()
    this.intervalId = setInterval(checkForHeightChange, 10)
  }

  componentWillUnmount() {
    clearInterval(this.intervalId)
  }

  render() {
    const {
      data,
      renderItem,
      emptyText,
      dimensions,
    } = this.props
    const { width } = dimensions
    const { availableHeight } = this.state
    return (
      <Layout
        centerVertical
        style={{
          height: '100%',
        }}>
        {data && data.length > 0 ? (
          <div
            style={{
              display: 'flex',
              flex: 1,
              height: '100%',
              backgroundColor: 'red',
              alignItems: 'stretch',
              justifyContent: 'stretch',
            }}
            ref={ref => this.containerDiv = ref}
          >
            <List
              height={availableHeight}
              itemCount={data.length}
              width={width > 800 ? 800 : width}
            >
              {({ index, style }) => {
                console.log('style', style)
                return (
                  <div style={style}>
                    {renderItem({
                      item: data[index], index
                    })}
                  </div>
                )
              }}
            </List>
          </div>
        ) : (
            <Text bold center padding accent>{emptyText}</Text>
          )}
      </Layout>
    )
  }
}


export default withScreenDimensions(ListView)

これを芋るこずができるコヌドサンドボックスを共有したすか

芪がレンダリングされるたびに倉曎されるため、アむテムレンダラヌにむンラむン関数を䜿甚しないこずをお勧めしたす。これは、䞍芁な再マりントが発生するためです。 これが、すべおの䟋がむンラむン関数を回避する理由です。

@ graphee-gabriel私もこれを持っおいたした、ドキュメントはそれに぀いお蚀及しおいたせんが、あなたはあなたの行コンポヌネントが参照を受け取るこずをサポヌトするようにする必芁がありたす

Row = React.forwardRef(
      (row, ref) => (
        <div ref={ref} style={row.style}>
          {renderItem({
            item: data[row.index],
            index: row.index,
          })}
        </div>
      ),
    )

こんにちは、どうぞ

https://codesandbox.io/s/sweet-sea-irxl8?fontsize=14

はい、確かにむンラむン関数の堎合、これは私がreact-windowに移行しようずした非垞に叀いコヌドであり、ここでもそれを改善するのに時間がかかりたせんでした。
ご意芋をいただきありがずうございたす。 このサンドボックスで芋぀けたものを教えおください。

Annnnndサンドボックスを実行する前に@brunolemosメッセヌゞを確認する必芁がありたした。
これは欠けおいたステップであり、私の問題を修正したした、ありがずう

別の問題が発生したした。@ bvaughnを再珟できるようにサンドボックスを曎新したした
ここでそれを芋぀けおください https 

これでリストは正垞に機胜したすが、奇劙なこずに、コンテンツずずもに倧きくなり、二床ず瞮小するこずはありたせん。

意味

  1. 6぀のアむテムを衚瀺した堎合、最埌たでスクロヌルするず、すべお問題ありたせん。
  2. コンテンツを倉曎しお20個のアむテムを衚瀺し、最埌たでスクロヌルしたす。すべお問題ありたせん。
  3. コンテンツを6アむテムに戻し、最埌のアむテムたでスクロヌルしたすが、前のコンテンツ20アむテムのデヌタセットから残っおいるように芋える空癜をスクロヌルし続けるこずができたす。

別の問題が発生したした。@ bvaughnを再珟できるようにサンドボックスを曎新したした
ここでそれを芋぀けおください https 

これでリストは正垞に機胜したすが、奇劙なこずに、コンテンツずずもに倧きくなり、二床ず瞮小するこずはありたせん。

意味

  1. 6぀のアむテムを衚瀺した堎合、最埌たでスクロヌルするず、すべお問題ありたせん。
  2. コンテンツを倉曎しお20個のアむテムを衚瀺し、最埌たでスクロヌルしたす。すべお問題ありたせん。
  3. コンテンツを6アむテムに戻し、最埌のアむテムたでスクロヌルしたすが、前のコンテンツ20アむテムのデヌタセットから残っおいるように芋える空癜をスクロヌルし続けるこずができたす。

私は同じ問題を抱えおいたす

これはたさに私が必芁ずしおいたものです。
1.6.0-alpha.1のDynamicSizeListをreact-virtualized-auto-sizerおよびreact-window-infinite-loaderず組み合わせおテストしたずころ、非垞に良い結果が埗られたした。
これを前進させるために私が手助けできるこずはありたすか

こんにちは@ bvaughn 、 https //github.com/bvaughn/react-window/issues/6#issuecomment -509213284からコヌドサンドボックスをチェックする時間がありたしたか

こんにちは、チャットアプリにDynamicSizeListを䜿甚しおいたす。
玠晎らしい機胜をありがずう。

ただし、パフォヌマンスの䜎䞋ず倚くのスクリプト凊理に問題がありたす。
スクロヌルするず、CPUは垞に䞊昇し、倚くの堎合100に達したす。
解決策に぀いお䜕かアむデアはありたすか

import { useChatList } from '../../../hooks/chat/useChatList';
import LoadingSpinner from '../../../utils/LoadingSpinner';

import dynamic from 'next/dynamic';
import * as React from 'react';
import AutoSizer from 'react-virtualized-auto-sizer';
// @ts-ignore
import { DynamicSizeList as List } from 'react-window';
import { Message } from 'src/app/typings';

const { useRef, useCallback } = React;

const RowItem = React.memo(
  ({ forwardedRef, style, index, data }: any) => {
    const item = data[index] as Message;
    if (item) {
      return (
        <div id={item.messageId} ref={forwardedRef} style={style}>
          {item.text && item.text.plainText}
        </div>
      );
    }
    return null;
  },
  (prevProps, newProps) => {
    const { index, data } = prevProps;
    const { index: newIndex, data: newData } = newProps;
    let isMemo = true;
    isMemo = isMemo && index === newIndex;
    isMemo = isMemo && data.length === newData.length;
    return isMemo;
  }
);

function ChatList() {
  const listRef = useRef<HTMLInputElement>();

  const { formatMessages: messages, isLoadingMessages } = useChatList();

  const keyCreator = useCallback((index: number) => `ChatList/RowItem/${messages[index].messageId}`, [messages]);

  if (isLoadingMessages && (!messages || messages.length <= 0)) {
    return <LoadingSpinner />;
  }
  return (
    <div style={{ flex: 1, height: '100%', width: '100%' }}>
      <AutoSizer>
        {({ height, width }) => (
          <List
            ref={(lref: HTMLInputElement) => {
              if (lref !== null) {
                listRef.current = lref;
              }
            }}
            itemCount={messages.length}
            itemData={messages}
            itemKey={keyCreator}
            height={height}
            width={width}
            overscanCount={10}
          >
            {React.forwardRef((props, ref) => (
              <RowItem forwardedRef={ref} {...props} />
            ))}
          </List>
        )}
      </AutoSizer>
    </div>
  );
}

export default ChatList;

スクリヌンショット 2019-07-14 11 49 54

こんにちは@bvaughn 、
職堎のサむズ倉曎時にアむテムの高さを再蚈算する正しい方法は䜕ですか 䞊蚘のコメントの助けを借りお、私はいく぀かのデモを䜜成しおいたすhttps://codesandbox.io/s/angry-hill-tcy2m
職堎の幅をマりスで倉曎する堎合、すべおのアむテムの高さを再蚈算する必芁がありたすVariableSizeListコンポヌネントの内郚の高さキャッシュをクリアしおいる可胜性がありたす...

動的リストの解決策はありたすか4時間かけお機胜させようずしたした
すべおのコメントを読んだ埌、私は終わりたした😠
あなたたちが䜕か実甚的な解決策を持っおいるなら、私に提䟛しおください

このプロゞェクトには「君たち」はいない。 それは䞀人で維持されたす。

そしお、同じ日に耇数の問題に぀いお同じこずに぀いお䞍平を蚀っおコメントを残すこずは、䞀皮の軜率です。 ぜひ、react-virtualizedをご利甚ください。

このブラむアンのようなコメントを残しお本圓に申し蚳ありたせん。 私は埌でこの問題を芋぀けお、それからすべおのコメントを読みたした、そしお私は他の人が少なくずもあなたを助けおいるず思いたした

@ShivamJokerほが機胜するようになりたした。完党に機胜するために残された唯䞀のこずは、コンテンツをより少ないアむテムに倉曎した埌、増加し続けるが決しお瞮小しない党高です。 これが解決されれば、私のナヌスケヌスでは完党に機胜するように芋えたす。

@bvaughn https://github.com/bvaughn/react-window/issues/6#issuecomment -509213284のサンドボックスで䟋を確認する時間がありたすか

=> https://codesandbox.io/s/sweet-sea-irxl8

したがっお、短いリストから始たりたす。

  • リストの最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Long Listをクリックしたす
  • 最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Short Listをクリックしたす
  • 最埌にもう䞀床䞋にスクロヌルしお、短いリストの埌に倚くの空癜スペヌスが続くこずを確認したす。

ありがずうございたした

@ShivamJokerほが機胜するようになりたした。完党に機胜するために残された唯䞀のこずは、コンテンツをより少ないアむテムに倉曎した埌、増加し続けるが決しお瞮小しない党高です。 これが解決されれば、私のナヌスケヌスでは完党に機胜するように芋えたす。

@ bvaughn 6コメントのサンドボックスの䟋を確認する時間がありたすか

=> https://codesandbox.io/s/sweet-sea-irxl8

したがっお、短いリストから始たりたす。

  • リストの最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Long Listをクリックしたす
  • 最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Short Listをクリックしたす
  • 最埌にもう䞀床䞋にスクロヌルしお、短いリストの埌に倚くの空癜スペヌスが続くこずを確認したす。

ありがずうございたした

ええ、基本的に内郚コンテナはデヌタのフィルタリング/倉曎時に高さをリセットする必芁がありたす。

@ShivamJokerほが機胜するようになりたした。完党に機胜するために残された唯䞀のこずは、コンテンツをより少ないアむテムに倉曎した埌、増加し続けるが決しお瞮小しない党高です。 これが解決されれば、私のナヌスケヌスでは完党に機胜するように芋えたす。

@ bvaughn 6コメントのサンドボックスの䟋を確認する時間がありたすか

=> https://codesandbox.io/s/sweet-sea-irxl8

したがっお、短いリストから始たりたす。

  • リストの最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Long Listをクリックしたす
  • 最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Short Listをクリックしたす
  • 最埌にもう䞀床䞋にスクロヌルしお、短いリストの埌に倚くの空癜スペヌスが続くこずを確認したす。

ありがずうございたした

おかげで私はそれが他のナヌザヌにもうたく機胜するこずを期埅しお同じこずを実装したした
はい、スクロヌルの高さの問題も芋たした

@ graphee-gabrielですが、アプリバヌがスクロヌルダりン時に非衚瀺になっおいた問題がもう1぀ありたすが、これは珟圚発生しおいたせん。解決策は䜕でしょうか。
image

良い䞀日。 デモプロゞェクトでDinamycSizeListを䜿甚したした。 すべおが順調でしたが、しばらくするず、リストコンポヌネントが正しく機胜しなくなったこずに気づきたした。 最初は、react-windowが䟝存するラむブラリだず思いたした。 しかし、あなたのデモを芋おください
https://react-window-next.now.sh/#/examples/list/dynamic -size
過去には完党に機胜しおいたしたが、ほが同じ結果に気づきたした。 これらのバグの原因を教えおください。

@simeonoff

ええ、基本的に内郚コンテナはデヌタのフィルタリング/倉曎時に高さをリセットする必芁がありたす。

どうすればよいですか状態の高さを入力しようずしたしたが、機胜しないようです
解決策はありたすか

@simeonoff

ええ、基本的に内郚コンテナはデヌタのフィルタリング/倉曎時に高さをリセットする必芁がありたす。

どうすればよいですか状態の高さを入力しようずしたしたが、機胜しないようです
解決策はありたすか

ラむブラリによっお内郚的に実装する必芁がありたす。

@ShivamJokerほが機胜するようになりたした。完党に機胜するために残された唯䞀のこずは、コンテンツをより少ないアむテムに倉曎した埌、増加し続けるが決しお瞮小しない党高です。 これが解決されれば、私のナヌスケヌスでは完党に機胜するように芋えたす。

@ bvaughn 6コメントのサンドボックスの䟋を確認する時間がありたすか

=> https://codesandbox.io/s/sweet-sea-irxl8

したがっお、短いリストから始たりたす。

  • リストの最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Long Listをクリックしたす
  • 最埌たでスクロヌルダりン
  • 䞊にスクロヌルしおShow Short Listをクリックしたす
  • 最埌にもう䞀床䞋にスクロヌルしお、短いリストの埌に倚くの空癜スペヌスが続くこずを確認したす。

ありがずうございたした

キヌを蚭定しお空癜を防ぐこずができたす。
https://codesandbox.io/s/blissful-voice-mzjsc

こんにちは@bvaughnこの玠晎らしいプロゞェクトに感謝​​したす

必芁に応じお、DynamicListsコヌドにかなりの時間を費やしお、制限なしでどこにでもスクロヌルする方法ず、枬定されたものずされおいないものにスクロヌルする方法を理解しようずしおいたす。

私はここでなんずかそうするこずができたしたhttps://github.com/bvaughn/react-window/compare/issues/6...Sauco82issues / 6 lastMeasuredIndexを取り陀き、代わりにitemIsMeasuredアむテムごずにチェックしたす

私はオヌプン゜ヌスプロゞェクトに参加したこずもFlowを䜿甚したこずもないので、これが圹立぀か、含める䟡倀があるかどうか、たたPRを盎接詊すか、ここで議論する必芁があるかどうかはよくわかりたせん。

喜んでお手䌝いさせおいただきたすので、䜕か必芁な堎合はお知らせください。

ねえ、これははるかに簡単な解決策ですサむズを蚈算するためにゎヌスト芁玠をDOMに远加する必芁はありたせん
コヌドサンドボックス

ねえ、これははるかに簡単な解決策ですサむズを蚈算するためにゎヌスト芁玠をDOMに远加する必芁はありたせん
コヌドサンドボックス

驚くばかり わたしにはできる。 良くやった。

@Kashkovskyは、曎新された堎合にサむズを蚈算したした
およびitemSizeは1回呌び出したす

@ userbq201 @Kashkovsky玠晎らしい回避策 どういうわけか私の堎合、それは箱から出しお動䜜したせんでした、私は次のようにChatHistory.jsのコヌドを倉曎しなければなりたせん

    const listRef = useRef(); // added
    const sizeMap = useRef({});
    const setSize = useCallback((index, size) => {
        sizeMap.current = {...sizeMap.current, [index]: size};
        listRef.current.resetAfterIndex(index); // added
    }, []);
    const getSize = useCallback(index => sizeMap.current[index] || 60, []);
    // ...
    <List ref={listRef}

それ以倖の堎合、すべおのアむテムは同じデフォルトの高さでレンダリングされたす。 あなたの堎合、それはそのたた動䜜したす、なぜ違いがあるのか​​説明できたせん...倚分@bvaughnはできたす。

@bvaughn SSRに察しお同様の動䜜を有効にする必芁がある堎合はどうなりたすか その偎のヒントはありたすか

@bvaughnそれは私ですか、それずもあなたのデモは機胜しおいたせんか

玠晎らしい実装@Kashkovsky @ kirill-konshinず@ userbq201 

この゜リュヌションでメモ化を䜿甚しおどのようにアプロヌチしたすか

ChatMessageをmemoでareEqualでラップしようずしたしたが、メッセヌゞがリストに远加されるたびにReactは各オブゞェクトを再レンダリングしたす。

私の他のFixedSizedListsでは、メモ化はそのmemo / areEqualラッパヌで正垞に機胜したすが、 ref={root}が圱響しおいる可胜性がありたすか

Reactがコンポヌネントを再レンダリングしおいるかどうかは、

私はここで䟋をフォヌクしたした https 


線集メモ化を修正したした-最初の機胜コンポヌネントをメモでラップするこずを意図しおいたす-ではなく私がしたように。 誰かがリスト内に耇雑なDOM構造を持っおいる堎合たたは私のようにビデオをマップする必芁がある堎合のメモ化された゜リュヌションは次のずおりです https 


線集2行の最初のレンダリングは完党に問題ないこずがわかりたしたが、 resetAfterIndex呌び出しは管理が非垞に困難です。 デヌタが倉曎されたすたずえば、ナヌザヌが別の䌚話を遞択した堎合。 しかし、本圓の問題は、新しいsetSizeが終了する前にresetAfterIndexが実行されおいるように芋えるこずです。 したがっお、キャッシュされたスタむルは正垞にクリアされたすが、ブラりザがコンテンツのサむズ倉曎を完了しおいないため、叀いスタむルの新しいキャッシュが再床生成されたす。

それが曞面で意味があるかどうかはわかりたせんが、今のずころこれにピンを入れる必芁がありたす。 誰かがコンテンツを動的に倉曎し、曎新された高さスタむルを維持しおいる堎合はお知らせください。

私は他にもたくさんのreact-window実装を持っおいるので、この1぀のナヌスケヌスにreact-virtualizedを䜿甚するのではなく、ここで良い解決策を芋぀けたいず思いたす。


線集3私は぀いにセミ゚レガントな解決策を思い぀いたので、これが私の最埌の線集になりたす。

1.itemDataを倉曎する必芁がある堎合぀たり、䌚話が倉曎されおいる堎合、党䜓をアンマりントしたすコンポヌネントを䜜成し、新しいitemDataで再マりントしたす。 これは、setStateコヌルバックを䜿甚しお実行できたす。 これにより、デヌタを倉曎したずきに叀い高さのスタむルが匕き継がれないようになりたす。

2。 ChatContext介しお{sizeMap, setSize, listRef}をChatMessageに枡したした。 そうすれば、単にサむズを盲目的に蚭定する代わりに、ChatMessageにサむズを蚭定しお叀いサむズず比范するように指瀺できたす。 叀いサむズが新しいサむズず異なる堎合は、呌び出しresetAfterIndexで始たるindexず力のアップデヌトにtrueを枡したす。

したがっお、私の新しいChatMessageは次のようになりたす。

const ChatMessage = ({ message, index }) => {
    const { setSize, sizeMap, listRef } = useContext(ChatContext);
    const root = React.useRef();
    useEffect(() => {
        let oldSize = sizeMap[index];
        let newSize = root.current.getBoundingClientRect().height;
        setSize(index, newSize);
        if(newSize !== oldSize){
            listRef.current.resetAfterIndex(index,true);
        }
    }, [sizeMap, setSize, listRef]);

    return (
        <div ref={root}
             {message.body}
        </div>
    );
};
export default ChatMessage;

3.基本的にリスナヌであるものをに远加したした新しくマりントされるのを埅぀コンポヌネントレンダリングされたす。 レンダリングされるず、䞀番䞋たでスクロヌルしたす。 これにより、scrollTo関数をcomponentDidMountに盎接配眮しようずする際の問題が修正されたす。これは、そのメ゜ッドが呌び出される前にレンダリングされるこずがないためです。 そうこのように芋えたす

class Chat extends Component {
    constructor(props) {
        super(props);
        this.listRef = createRef();
        this.state = {
            initialScrollComplete: false,
            interval: null
        };
    }

    componentDidMount(){
        // Create interval to check if list is ready. Once ready, scroll to bottom of list.
        this.setState({interval: setInterval(()=>{
            if(this.listRef.current && !this.state.initialScrollComplete){
                this.listRef.current.scrollToItem(this.props.chatHistory.length - 1, "end");
                this.setState({initialScrollComplete: true});
            }
        },25)});
    }

    componentDidUpdate(prevProps, prevState) {

        // Clear interval if scroll has been completed
        if(!prevState.initialScrollComplete && this.state.initialScrollComplete){
            clearInterval(this.state.interval);
            this.setState({interval: null});
        }

        // If new message is transmitted, scroll to bottom
        if(prevProps.chatHistory && this.props.chatHistory && prevProps.chatHistory.length !== this.props.chatHistory.length){
            this.listRef.current.scrollToItem(this.props.chatHistory.length - 1, "end");
        }

    }

    render() {
        return <ChatHistory listRef={this.listRef} chatHistory={this.props.chatHistory}/>;
    }
}

サファリには本圓に奇劙な振る舞いがあるようです。

DynamicSizedListdivの高さず行の高さたたはmargin-topが正しく機胜しないコンテンツがオヌバヌラップし始めたす。

行のりィンドり幅/コンテンツが倉曎されおも、新しい高さは再蚈算されず、コンテンツの新しい高さで機胜するように倉曎されたせん。

これを修正しおいるように芋えるのは、コンテンツがスクロヌル可胜で、行が衚瀺されなくなるポむントたでスクロヌルし、そこたでスクロヌルしお戻るず、正しくレンダリングされる堎合です。

最初のペヌゞの読み蟌み時にコンテンツが正しくレンダリングされないため、曎新しおも問題が解決しないようです/

ChromeやFirefoxなどの他のブラりザでも問題なく動䜜したす。 Safariは玠晎らしいですが、残念ながら、アプリはそれを䜿甚する人々のために動䜜する必芁がありたす。

Screenshot 2020-02-15 at 14 27 19

私は本圓にいく぀かの助けを䜿うこずができたした

@tastyqbitSafariずInternetExplorerでも同じ問題が発生したした。 あなたが蚀ったように、展開された行を過ぎおスクロヌルしおから埌ろにスクロヌルするず、正しくレンダリングできたすが、もちろんそれは実際には問題を解決したせん。

回避策を芋぀けたら、私に知らせおください

@afreix @tastyqbitSafariずInternetExplorerでの問題は、これらのブラりザヌでのResizeObserverのサポヌトの欠劂が原因であるず確信しおいたす。 私はたさにあなたの問題を抱えおいおスクロヌルバックで修正したした、ポリフィルを远加するこずで解決したした。 互換性テヌブルに぀いおは、 MDNを参照しおください。

ResizeObserverがないず、コン゜ヌルに譊告が衚瀺されるはずです。

このhttps://codesandbox.io/s/agitated-jennings-o9nn6のようなものはどうですか

102のVariableSizeList + ItemMeasurerの基本的な䜿甚これは非垞に単玔なアプロヌチですが、䞀時的な解決策ずしおは少し機胜しおいるようですそれほど悪くはありたせん😂🀔

私たちのチヌムでは、ランダムなサむズのテキストデヌタの倧芏暡なリストをレンダリングする必芁性に遭遇したした。
私たちにずっお、アむテム間を正確にゞャンプし、遅れるこずなくスクロヌルする機胜は必須でした。
かなりのオンラむン怜玢の埌、私はあきらめおこのラむブラリを曞き
それがあなたの䜕人かの䞀時的な解決策ずしお圹立぀こずを願っおいたすsmile_cat

ねえ、
いく぀かの䜜業の埌でそれを曎新したかったのですが、ラむブラリはたずもな状態になり、アむテムが初めおレンダリングされた埌にサむズが倉曎されない堎合は良い解決策になるず思いたす。

@ gnir-りィンドりのサむズが倉曎され、コンテナのサむズが倉曎されおリストのサむズが倉曎された堎合はどうなりたすか

このスレッドを読んで、幅が倉わる可胜性のあるアむテムを凊理するためのより良い方法があるかもしれないず思いたす。

ここでの「倉数」の定矩は、セット党䜓で倉数です。 実際のアむテムのサむズは静的であり、動的ではありたせん。 テキストが倉曎された堎合、サむズ倉曎たたは倉曎䞭にサむズが倉曎される可胜性があるため、おそらく動的がより適切な甚語です。

これが機胜する方法は、芪のスクロヌルを聞くこずです。

アルゎリズムは次のように機胜したす。

  • 各アむテムの掚定サむズを蚈算したす-これは非垞に効率的である必芁がありたす。 完璧である必芁はありたせん。 + -20で問題ありたせん。

  • ナヌザヌがスクロヌルしおも倉曎が衚瀺されないように、衚瀺されおいるアむテムのみをレンダリングし、さらに20倚くレンダリングしたす。

  • 「高さ」が掚定高さに蚭定されおいる他のすべおの「ゎヌスト」がありたす。 それはただの空のdivです。 このようにしお、スクロヌルバヌはほが右に芋えたす。

  • アむテムは、ビュヌポヌトにある堎合にのみ衚瀺されたす。 それ以倖はゎヌストアむテムが衚瀺されたす。

これの唯䞀の欠点は、スクロヌルバヌの高さがわずかに倉化するこずです。 これがナヌザヌの気を散らすかどうかはわかりたせん。 スクロヌルリストが倧きい堎合もありたす。 掚定サむズがスクロヌルバヌの長さに圱響を䞎えないようにバッファを増枛するこずで、これをだたすこずができるかもしれたせん。

@ gnir-りィンドりのサむズが倉曎され、コンテナのサむズが倉曎されおリストのサむズが倉曎された堎合はどうなりたすか

最新バヌゞョン 2.2.0 の時点で、コンポヌネントはリスト党䜓のサむズ高さず幅の倉曎をサポヌトしおいたす。

このスレッドを読んで、幅が倉わる可胜性のあるアむテムを凊理するためのより良い方法があるかもしれないず思いたす。

ここでの「倉数」の定矩は、セット党䜓で倉数です。 実際のアむテムのサむズは静的であり、動的ではありたせん。 テキストが倉曎された堎合、サむズ倉曎たたは倉曎䞭にサむズが倉曎される可胜性があるため、おそらく動的がより適切な甚語です。

これが機胜する方法は、芪のスクロヌルを聞くこずです。

アルゎリズムは次のように機胜したす。

  • 各アむテムの掚定サむズを蚈算したす-これは非垞に効率的である必芁がありたす。 完璧である必芁はありたせん。 + -20で問題ありたせん。
  • ナヌザヌがスクロヌルしおも倉曎が衚瀺されないように、衚瀺されおいるアむテムのみをレンダリングし、さらに20倚くレンダリングしたす。
  • 「高さ」が掚定高さに蚭定されおいる他のすべおの「ゎヌスト」がありたす。 それはただの空のdivです。 このようにしお、スクロヌルバヌはほが右に芋えたす。
  • アむテムは、ビュヌポヌトにある堎合にのみ衚瀺されたす。 それ以倖はゎヌストアむテムが衚瀺されたす。

これの唯䞀の欠点は、スクロヌルバヌの高さがわずかに倉化するこずです。 これがナヌザヌの気を散らすかどうかはわかりたせん。 スクロヌルリストが倧きい堎合もありたす。 掚定サむズがスクロヌルバヌの長さに圱響を䞎えないようにバッファを増枛するこずで、これをだたすこずができるかもしれたせん。

これはすでに@bvaughnによっおreact-virtualized実装されおいたす。 このアプロヌチの䞻な欠点は、特定の行ぞのゞャンプがうたく機胜せず、䞊にスクロヌルするず芖芚的なバグが発生するこずです。

@ gnir-work ah .. ok ...倚分、䜜業を䞭止しお、react-virtualizedを芋おみたしょう。

スクロヌルアップの問題は正しいず思いたすが、「掚定サむズ」を蚭定しお、コンポヌネントがマりントされたら実際のサむズに倉換するこずで、これを修正できるず思いたす。

...しかし、もちろん別の問題は動的コンテンツの凊理です。 䜕かが曎新されるず、コンポヌネントの高さが倉わりたす。

掚定サむズが機胜するよりも正確である堎合、たずえば、私はしばらく前に、react-virtualizedを䜿甚しお動的な高さの仮想化リストを実装し、掚定サむズが正確である限りうたく機胜したした。 そうしないず、行にスクロヌルする機胜がアプリを壊しおしたいたす☹

Mail for Windows10から送信

差出人ケビンバヌトン
送信2020幎4月14日火曜日23:07
宛先bvaughn / react-window
CcNir Geller; 蚀及する
件名Re[bvaughn / react-window]ゞャストむンタむム枬定コンテンツをサポヌト6

@ gnir-work ah .. ok ...倚分、䜜業を䞭止しお、react-virtualizedを芋おみたしょう。
スクロヌルアップの問題は正しいず思いたすが、「掚定サむズ」を蚭定しお、コンポヌネントがマりントされたら実際のサむズに倉換するこずで、これを修正できるず思いたす。
...しかし、もちろん別の問題は動的コンテンツの凊理です。 䜕かが曎新されるず、コンポヌネントの高さが倉わりたす。
—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、登録を解陀しおください。

-
このメヌルは、アバストアンチりむルス゜フトりェアによっおりむルスがチェックされおいたす。
https://www.avast.com/antivirus

@ gnir-仕事ああ...私は「行にスクロヌル」機胜は必芁ないず思いたす..倚分私は間違っおいたすが。

これはあなたのニヌズに十分なはずです😊

Mail for Windows10から送信

差出人ケビンバヌトン
送信2020幎4月14日火曜日23:13
宛先bvaughn / react-window
CcNir Geller; 蚀及する
件名Re[bvaughn / react-window]ゞャストむンタむム枬定コンテンツをサポヌト6

@ gnir-仕事ああ...私は「行にスクロヌル」機胜は必芁ないず思いたす..倚分私は間違っおいたすが。
—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、登録を解陀しおください。

-
このメヌルは、アバストアンチりむルス゜フトりェアによっおりむルスがチェックされおいたす。
https://www.avast.com/antivirus

次の堎合の回避策ずしお

  • リストの行の高さは、内偎のテキストのみに䟝存したすさらに、寞法が決たっおいる芁玠もありたす
  • あなたのリストは固定幅です

コンポヌネント党䜓をレンダリングする代わりに、 CanvasRenderingContext2D.measureTextを䜿甚しお行の高さを蚈算できたすpoop

CodeSandbox

@bvaughn npmで新しいアルファ版を公開する予定はありたすか 1.6.0-alpha.1以降、曎新はありたせん😕

@bvaughn曎新はありたすか 最近のバヌゞョンで修正されたすか

TypescriptをDynamicSizeList䜿甚したい堎合は、モゞュヌルの拡匵により、DefinitelyTyped定矩からDynamicSizeListするために必芁な型を指定できたす昚幎このスレッドに投皿されたク゚リの回避策。

プロゞェクトに以䞋を远加したす。

import React, { Component } from 'react'

declare module 'react-window' {
  export type DynamicSizeListProps = Omit<FixedSizeListProps, 'itemSize' | 'scrollToItem'>
  export class DynamicSizeList extends Component<DynamicSizeListProps> {}
}

次に、通垞どおりむンポヌトしたす。

import {
  DynamicSizeList,
  DynamicSizeListProps,
} from 'react-window'

// use as normal...

@types/react-window FixedSizeListProps定矩では、 @types/react-window最初にむンストヌルする必芁がありたす。

typedefをありがずう、今すぐ远加したす 私は1幎以䞊prodでDynamicSizeListを䜿甚しおいたす。 珟圚、このフォヌクに基づいおいたす "@john-osullivan/react-window-dynamic-fork": "^1.9.0-alpha.1" それはただ最新のものですか。 これが実際にリリヌスされるかどうか/い぀リリヌスされるかに぀いおの䞍確実性のために、私はreact-virtuosoに切り替えようずしたした。 しかし、パフォヌマンスが䜎䞋し、これでスタックしおいるこずがわかりたした。

@bvaughnはただカりパスを舗装し、これをnpmにリリヌスする時ですか 準備ができおいないこずがただ心配な堎合は、名前をExperimentalDynamicSizeList倉曎しただけかもしれたせん。

こんにちはみんな あなたの努力ずこの玠晎らしい図曞通に感謝したす。 この機胜を本圓に楜しみにしおいたす ただし、この問題に関する情報をREADMEおよびドキュメント/䟋に远加するこずをお勧めしたす。 動的コンテンツが実際にはラむブラリでサポヌトされおおらず、固定/既知のサむズのアむテムにのみ圹立぀こずを理解するのにかなりの時間がかかりたした。 READMEには、これを远加できるすばらしいFAQセクションがあるず思いたす。

テヌブル/グリッド/ツリヌを探しおいる堎合、これはVariableSizeGrid䞊に構築されたhttps://autodesk.github.io/react-base-table/examples/dynamic-row-heightsから始めるのが良いでしょう。

@ tony-scio 1.6.0-alpha.1のDynamicSizeListをInfiniteLoaderで䜿甚するための実甚的なコヌドサンドボックスを共有しおいただけたすか ありがずう、本圓にありがたいです。

誰かがこれをreact-beautiful-dndで動䜜させるようになりたしたか ドラッグするず、アむテムが互いにゞャンプするように芋えたす。

誰かがこれをreact-beautiful-dndで動䜜させるようになりたしたか ドラッグするず、アむテムが互いにゞャンプするように芋えたす。

私もこの答えを埅ちたすD

[助けお]
このリンクに衚瀺するコヌドはありたせん
dynamic-size-list-vertical
そしお私はこの胜力が必芁です。
ありがずう

[助けお]
このリンクに衚瀺するコヌドはありたせん
dynamic-size-list-vertical
そしお私はこの胜力が必芁です。
ありがずう

https://react-window-next.now.sh/#/examples/list/dynamic -size

これに関する曎新はありたすか できる限り䌌たようなものが必芁です通垞は非垞に少ないですが、堎合によっおは倚くなる可胜性がありたす。アむテムの倧きなレスポンシブグリッドリストをレンダリングしたすアむテムの高さは動的であり、モバむルではさたざたなテキストの折り返しなどによっお倉化したす。 react-windowがこのナヌスケヌスを凊理できれば、ゲヌムチェンゞャヌになるず思いたす。 そうでない堎合、信頌できる代替手段はありたすか

これに関する曎新はありたすか できる限り䌌たようなものが必芁です通垞は非垞に少ないですが、堎合によっおは倚くなる可胜性がありたす。アむテムの倧きなレスポンシブグリッドリストをレンダリングしたすアむテムの高さは動的であり、モバむルではさたざたなテキストの折り返しなどによっお倉化したす。 react-windowがこのナヌスケヌスを凊理できれば、ゲヌムチェンゞャヌになるず思いたす。 そうでない堎合、信頌できる代替手段はありたすか

@JavaJamieは、特に代替案を求めたためです-virtuosoラむブラリには、動的コンテンツを枬定するためのサポヌトが組み蟌たれおいたす。 免責事項私はそれの䜜者です。

@JavaJamieは、特に代替案を求めたためです-virtuosoラむブラリには、動的コンテンツを枬定するためのサポヌトが組み蟌たれおいたす。 免責事項私はそれの䜜者です。

react-virtuosoもreact-windowの2倍のサむズです。 䟝存関係のサむズを垞に念頭に眮く必芁がありたす。

https://bundlephobia.com/[email protected]
https://bundlephobia.com/[email protected]

私にはこの努力を終える時間も゚ネルギヌもないずいう事実を受け入れたした。 誰かが私が始めたブランチに足を螏み入れお終了したいのであれば、私はあなたの助けを歓迎したす。 これが新しいListおよびGridコンポヌネントずしおバヌゞョン2リリヌスにどのように適合するかに぀いおは、問題302も参照しおください。

結局、これには、非垞にうたく機胜する可芖性センサヌを䜿甚するようなものをれロから実装するこずになりたした。

それを取り陀いお新しいプロゞェクトを䜜成したり、ここに移動したりする堎合は、おそらくOSSを䜿甚するか、適切な堎所を指定するこずができたす。

1぀のトリックは、パフォヌマンスを向䞊させるために「ブロック」を䜿甚するこずです。 基本的に、各行を取埗し、実際に25アむテムのような芪ブロックに配眮し、必芁に応じおそれを亀換したす。

@burtonatorそれは本圓に圹に立ちたす

DynamicSizeListを䜿甚しおreact-selectのバグのない実装を提䟛できる人はいたすか
私はそれを䞀緒にうたく機胜させるこずができたせん。
珟圚、2぀の問題に盎面しおいたすスクリヌンショットがないため申し蚳ありたせん

  1. すべおのアむテムにはstyle={position: absolute, left: 0, top: 0}ありたすが、すべおのオプションが互いに重なり合っおいるため、このスタむルを䜿甚するこずはできたせん。
  2. スタむルプロップを䜿甚しない堎合、リストは適切に衚瀺されたすが、少しスクロヌルするず、オプションが含たれおいるリストの䞀郚が瞮小され、党䜓の高さは倉曎されたせん。 したがっお、スクロヌルするず、実際のオプションのxピクセルず長さ-xピクセルの空癜が衚瀺されたす。

2぀の実甚的な䟋は芋぀かりたせんでした。
Chromeでは1.9.0フォヌクを䜿甚しおいるこずに泚意しおください。

線集したす。 䞊蚘の非衚瀺のコメントセクションで答えを芋぀けたした。 https://github.com/bvaughn/react-window/issues/6#issuecomment -509016422

スクロヌルの問題を単玔化する方法の1぀は、スクロヌルがビュヌポヌトの高さからおよそ1぀以䞊離れおいる堎合に、スクロヌルバヌを䜿甚しお、ピクセル䜍眮ではなくリスト内のアむテムのむンデックスを瀺すこずです。 コンポヌネントは、Xピクセルを「䞋にスクロヌル」しようずする代わりに、目的のむンデックスの呚りにアむテムをレンダリングするだけです。 䞭途半端にアむテムをむンデックスN / 2にレンダリングし、䞋にアむテムをむンデックスN-1にレンダリングしたす。

これにより、コンポヌネントがサむズをレンダリングおよび蚈算するずきにスクロヌルサムが遅れるこずなく、リストの䞭倮たたは最埌にサムを盎接スクロヌルできたす。 珟圚、非垞に長いVariableSizeListコンポヌネントの堎合、カヌ゜ルがスクロヌルサムの移動よりも速くドラッグするため、䞀番䞋たでスクロヌルするこずはほが䞍可胜です。

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