React-window: CSS位置がスティッキーなグリッドヘッダーを修正

作成日 2019年03月08日  ·  14コメント  ·  ソース: bvaughn/react-window

こんにちは@bvaughn

あなたはこのリクエストに本当にうんざりしていると思い、ここでのコメントによると、私はあなたが検討するのに十分な軽量の解決策があるかもしれないと思います。

このソリューションは、ブラウザーネイティブのスクロールを維持し、ScrollSync風の動作を必要とせず、 createGridComponentレンダリングメソッドにいくつかの変更を加えるだけで済みます。 ただし、IE11はサポートされていません。 ドキュメントで明示的に呼び出されている限り、これは問題ないと思います。

ここでデモを見ることができます: https

これは私がプロトタイプとしてローカルに持っているものです-これのPRに興味があるなら、いくつかのことがハードコーディングされているので、やらなければならないことが間違いなくあります。 私はここで仕事をすることができますが、いくつかのガイダンスをいただければ幸いです。

これを追加したくない場合は完全に理解しています-最悪の場合、この問題は少なくとも他の人のためのアプローチを文書化することができます。

私の変更の概要:

まず、 items生成するときに、行== 0と列== 0をスキップします(Math.max()呼び出し)。 また、可視範囲のleftStickyItemsとtopStickyItemsにプッシュします。 ここでの変更はこれらだけです。

const items = [];
const topStickyItems = [];
const leftStickyItems = [];

if (columnCount > 0 && rowCount) {
  for (
    let columnIndex = Math.max(1, columnStartIndex); // Skip column 0
    columnIndex <= columnStopIndex;
    columnIndex++
  ) {
    topStickyItems.push(
      createElement(children, {
        columnIndex,
        data: itemData,
        isScrolling: useIsScrolling ? isScrolling : undefined,
        key: itemKey({ columnIndex, data: itemData, rowIndex: 0 }),
        rowIndex: 0,
        style: this._getItemStyle(0, columnIndex),
      })
    );
  }

  for (
    let rowIndex = Math.max(1, rowStartIndex); // Skip row 0
    rowIndex <= rowStopIndex;
    rowIndex++
  ) {
    // I'm leveraging this already existing loop, but this is probably
    // better as its own loop for clarity.
    leftStickyItems.push(
      createElement(children, {
        columnIndex: 0,
        data: itemData,
        isScrolling: useIsScrolling ? isScrolling : undefined,
        key: itemKey({ columnIndex: 0, data: itemData, rowIndex }),
        rowIndex,
        style: this._getItemStyle(rowIndex, 0),
      })
    );

    for (
      let columnIndex = Math.max(1, columnStartIndex); // Skip column 0
      columnIndex <= columnStopIndex;
      columnIndex++
    ) {
      items.push(
        createElement(children, {
          columnIndex,
          data: itemData,
          isScrolling: useIsScrolling ? isScrolling : undefined,
          key: itemKey({ columnIndex, data: itemData, rowIndex }),
          rowIndex,
          style: this._getItemStyle(rowIndex, columnIndex),
        })
      );
    }
  }
}

これらのアイテムを生成したら、return呼び出しの前に、スティッキーコンテナをitems配列に追加します。

const topLeftStyle = this._getItemStyle(0, 0);

items.unshift(
  createElement('div', {
    children: leftStickyItems,
    key: 'left-sticky',
    className: 'left-sticky',
    style: {
      height: estimatedTotalHeight,
      width: topLeftStyle.width,
      position: 'sticky',
      left: 0,
      zIndex: 1,
      transform: `translateY(-${topLeftStyle.height}px)`,
    },
  })
);

items.unshift(
  createElement('div', {
    children: topStickyItems,
    key: 'top-sticky',
    className: 'top-sticky',
    style: {
      height: topLeftStyle.height,
      width: estimatedTotalWidth,
      position: 'sticky',
      top: 0,
      zIndex: 1,
    },
  })
);

未解決の部分が1つあります-(0、0)位置。 グリッドの外側(左上の灰色のボックス)にレンダリングすることで、これを回避しました。 これは私のユースケースには問題ありませんが、このためのPRが必要な場合は、より良い解決策に値します。

最も参考になるコメント

@bvaughnまず最初に、この素​​晴らしい
トピックに戻ります。 私のプロダクションケースはかなり複雑です。スティッキーなはずの行と列に対する複数のグループ化です。 そこで、可能な限り単純化して、スティッキーリストの実装に基づいてこのサンドボックスを作成しました: https

全てのコメント14件

興味のある方はPRをご提出ください。 私は見て、それを考慮に入れるつもりです!

グリッドやリストに複雑さやスコープを追加するのは気が進まないことを前もって警告します。これらの機能は、本質的にアクセシビリティのためであるか、かなりの割合のユーザーが必要としているとは思われません。

おそらく、アドオンまたは別のエントリポイントで管理できるものでしょうか。

わかった。 これが私が思うことです!

この問題について個人的な行動を取る予定はないので、終了します。 (これは、自分が維持しているプロジェクトを自分で管理できるようにするためです。)

私が上で言ったことを考えると、PRを見て、これについての賛否両論を話し合うことができれば幸いです。 興味があればもっと話しましょう!

@apazzoliniここで量り、一日中あなたのブランチで遊んでいると言いたかったのですが、それは本当にうまくいきます! 私の特定のユースケースでは、5000セル(100行x 50列)のテーブルをレンダリングする必要があり、スクロール同期の最初の試みは問題ありませんでしたが、著しく遅れていました。 このネイティブCSSソリューションは本当にスムーズです。

これはおそらくコアライブラリ機能ではない(そしてそうすべきではない)ことを理解していますが、スティック/フリーズされた列と行を必要とする他の開発者にとってより多くの露出が見つかることを願っています。

素晴らしい仕事をありがとう、@ apazzolini!

@MarkLeMeriseそれがあなたのために働いていることをうれしく思います! 参考までに、これについてはまだPRを提出する予定ですが、react-virtualizedからこの戦略への移行をもう1か月遅らせる必要があったため、少し時間がかかります。

サファリのデモが機能していませんでした。 https://codesandbox.io/s/xjzrzmxv8q
追加する必要があります:

position: -webkit-sticky;

これありがとう !

ありがとう! FAQサンドボックスを更新します

これが「+1」に適した場所であるかどうかはわかりませんが(+1スパムの一部になりたくない)、粘着性(または一般的に子供のレンダリングを操作するメカニズム)が役立ちます(重要ですか?)私のユースケースのために。 今のところ、仮想化されたフリーズされた行と列を確保するために、少し大雑把なことをしなければなりません。 ただし、このような機能によってメンテナンスのハックルが発生する可能性があることは理解しています。過去にcellRangeRendererを使用したことがあるので、非常にすぐに複雑になる可能性があります。

これについてのPRはまだ見ていなかったので、私のコメントはここに行くのが最善のようでした。 私は少数派かもしれませんが、 react-windowを使用して大規模なデータセットを表示していることを考えると、スティッキーヘッダー行は大規模グリッドのユーザーエクスペリエンスの非常に重要な部分です。

とは言うものの、私はこのlibがフットプリントを削減し、速度を上げる方法の大ファンなので、ソリューションを直接構築したくない場合は、どこから来ているのかがわかります。 例としてコードサンドボックスをまとめてくれてありがとう@apazzolini

@bvaughnこのアプローチは、メインのREADMEにリンクするのに十分クリーンだと思いますか? Listバージョンは便利ですが、 Gridどのように適応させるかはすぐにはわかりませんCodeSandboxするとよいでしょう。

更新:CodeSandboxにはこのフォークバージョンが必要であることに気づきました。 その間にPRを終了します。

ねえ-そうです、デモでは、スクロール位置に関係なく、常にスティッキーヘッダーと左列をレンダリングするためにフォークが必要です。 ここでのPRのより良いアプローチは、スクロール位置に基づいてセルに加えてレンダリングするいくつかの補助範囲をカスタマイズできるようにすることだと思います。

とは言うものの、私はこれと必要な他のカスタムロジックを直接サポートするために独自の仮想化コンポーネントを作成することになったので、ここで何かを提出することはほとんどありません。 申し訳ありません。

ねえ-そうです、デモでは、スクロール位置に関係なく、常にスティッキーヘッダーと左列をレンダリングするためにフォークが必要です。 ここでのPRのより良いアプローチは、スクロール位置に基づいてセルに加えてレンダリングするいくつかの補助範囲をカスタマイズできるようにすることだと思います。

とは言うものの、私はこれと必要な他のカスタムロジックを直接サポートするために独自の仮想化コンポーネントを作成することになったので、ここで何かを提出することはほとんどありません。 申し訳ありません。

私は現在、複数の列を持つ大きなデータセットを表示しようとしているところですが、スティッキーな左の列とスティッキーなヘッダーの両方を解決するのに少し苦労しています。 仮想化コンポーネントをどのように実装したかへのリンクを提供できますか?

@bvaughnまず最初に、この素​​晴らしい
トピックに戻ります。 私のプロダクションケースはかなり複雑です。スティッキーなはずの行と列に対する複数のグループ化です。 そこで、可能な限り単純化して、スティッキーリストの実装に基づいてこのサンドボックスを作成しました: https

私のAndroid + Chromeで見栄えがします👍

@astorchousスティッキーヘッダー/列グリッドの例をありがとうございます。

@astorchousによる例を拡張して、VariableSizeGridを操作しました。 私の実装はここにあります: https

申し訳ありませんが、私の例ではjsxを使用していません。 また、何らかの理由で、グリッドがすぐに表示されるとは限りません。 表示するには、出力ウィンドウをリロードする必要がある場合があります。

このページは役に立ちましたか?
0 / 5 - 0 評価