2016-10-27 23 views
0

説明パフォーマンスの問題

私が反応し、仮想化VirtualScrollでレンダリング項目の潜在的に長いリストを持っています。
リストの各項目(行)にはかなりの量の要素があり、そのうちの1つはコンテキストメニューを開きます。私は、のメニューをレンダリングするためにreact-tetherを使用しようとしています(項目がスクロール可能なリストの一番下にあるときに非表示にならないようにします)。そして、ユーザがスクロールしている間、リスト。
私の問題は、つながれたメニューの位置を更新する際に顕著な遅れがあることです。

私がこれまでに撮影したいくつかのステップ

:単純なリストレンダリング

  1. VirtualScrollなし。テント付きメニューはスムーズにレンダリングされ、顕著なジャンクはありませんでした。それで私は問題がreact-virtualized
  2. であると結論付けました。私のrowRendererrecommended hereのようにメニュートリガーだけになりました。
  3. 行コンポーネントにshouldComponentUpdateを実装しました。これにより、知覚される性能が大幅に改善され、遅延が大きく減少しましたが、それでもなお目立つようになりました。
  4. Chromeのdevtoolsのタイムラインを確認しました。 Grid.jstether.jsの両方によってトリガーされたリフローがあります。

ライブラリバージョン:

  • 反応する仮想化Vを7.24.3(大規模なプロジェクト、まだを8.xするステップをする準備ができていない)
  • 反応し、テザーVを0.5。 0.2
  • が反応し、V。15.2.1

ワーキングデモ

https://plnkr.co/edit/f7OhCoCXkDsWbyjxhR3f

スクリーンショット:Plnkrが壊れていたことをFYI

screenshot

+0

"Chrome Devtoolsのタイムラインを確認しました。Grid.jsとtether.js._の両方によってトリガーされたリフローがあります" - テザーについてはわかりませんが、反応仮想化されたv8ではアップストリームの2つの重要な最適化-element-resize'ライブラリを使用して、多くの不要なリフローを防止しました。 'AutoSizer'を使用している場合は、この変更が役に立ちます。 (そうでなければ、それは意味がありません)私はちょうど小さなPlnkrであっても、私といくつかのコードを共有することができれば、あなたの問題を見てうれしいです。 – brianvaughn

+0

@brianvaughnはすばやく返信してくれてありがとう。 1.私は 'AutoSizer'を使用せず、独自のカスタムサイズ変更ハンドラを使用します。その場合、私は8.xにアップグレードし、 'AutoSizer'に切り替えようとするかもしれません。 2.共有可能な例を設定できるかどうか確認します。とにかく問題を分離するための良いアイデアかもしれない – burtyish

+0

@brianvaughn私はsplunkrの作業デモへのリンクで質問を更新しました。遅れが見えます。 – burtyish

答えて

0

。間違ったスタイルのバージョン(7.xの代わりに8.x)が含まれていました。

これを修正した後、私が見る視覚的な「遅れ」は、私がバージョン7.xで修正する方法を知っているものではありません。問題は、ブラウザが別のスレッドでスクロールを管理しているため(つまり、JSがJSをブロックしてUIが応答しなくなるのを防ぐためです)通常は、すべてのUIが一緒にスクロールされているため、これは目立つことはありませんが、この場合、モーダルはJSによって絶対的に配置されるため、ブラウザーのスクロール位置より遅れることがあります。

render() { 
    const { menuOpen } = this.state; 
    const { index, style } = this.props; 

    // Make sure open cells are on a higher z-index than others 
    if (menuOpen) { 
    style.zIndex = 2; 
    } 

    return (
    <div 
     className="row" 
     style={style} 
    > 
     {list[index]} 

     {/* Render your button OR menu item here */} 
    </div> 
); 
} 
https://plnkr.co/edit/NESPMzDz22JjwFVthve4?p=preview

彼らキーはこれです:この更新plunkのように言われていること

は、バージョン8へのアップグレードは、あなたに問題が解決しないポータルアプローチの代替を与えます

+0

提案していただきありがとうございます!私は要素の位置を 'スクロールペアレント'の相対的な位置から計算する機能を追加し、下端に近すぎる場合はメニューを垂直方向に反転するという方法であなたの提案を使用することができます。 – burtyish

+0

ポータルのアプローチを取る私の最初の動機は、メニューがリストの端に隠れるのを防ぐことでした。(これは 'overflow-y:hidden'を持っています)、最後の行の下でも完全に見ることができます。 'tether.js'は、JS _whileスクロールで要素の位置を更新するように最適化されていると私は理解しています。 – burtyish

+0

私はあなたが目指しているものを達成する方法を知らない(スクロールラグの可能性を排除する) - tether.jsのようなポータル技術を使用している間、あなたが望むことができる最高のものは、パフォーマンスをできるだけ最適化して遅れを減らすことです。そのためには、より仮想化されたv8にアップグレードすることを検討してください。そのバージョンにはパフォーマンスの最適化が含まれています。 親の 'List'の辺があふれていることを心配しています。残念ながら、それは私が言及したアプローチの限界です。それはあなたのニーズに合わないかもしれません。 :/ – brianvaughn

関連する問題