Nasza aplikacja wykorzystuje nieskończone przewijanie do nawigacji po dużych listach heterogenicznych elementów. Zmarszczek jest kilka:
- Często zdarza się, że nasi użytkownicy mają listę 10 000 pozycji i muszą przewijać ponad 3 tys.
- Są to bogate elementy, więc w DOM możemy mieć tylko kilkaset, zanim wydajność przeglądarki stanie się nie do przyjęcia.
- Przedmioty mają różną wysokość.
- Pozycje mogą zawierać obrazy i pozwalamy użytkownikowi przejść do określonej daty. Jest to trudne, ponieważ użytkownik może przeskoczyć do punktu na liście, w którym musimy załadować obrazy powyżej widocznego obszaru, co spowodowałoby przesunięcie treści w dół podczas ładowania. Niezrozumienie tego oznacza, że użytkownik może przeskoczyć do daty, ale potem zostać przeniesiony na datę wcześniejszą.
Znane, niekompletne rozwiązania:
( reaguj-nieskończone-przewijanie ) - To jest po prostu prosty element „załaduj więcej, gdy trafimy na najniższy” element. Nie usuwa żadnego DOM, więc umrze przy tysiącach przedmiotów.
( Pozycja przewijania z reakcją ) - Pokazuje, jak zapisać i przywrócić pozycję przewijania podczas wstawiania na górze lub na dole, ale nie obu razem.
Nie szukam kodu dla kompletnego rozwiązania (chociaż byłoby świetnie.) Zamiast tego szukam sposobu „Reagowania”, aby modelować tę sytuację. Czy stan pozycji przewijania jest czy nie? Jaki stan powinienem śledzić, aby zachować swoją pozycję na liście? Jaki stan muszę zachować, aby uruchomić nowy render, gdy przewijam w pobliżu dolnej lub górnej części renderowanego elementu?
zajrzyj na http://adazzle.github.io/react-data-grid/index.html# To wygląda na potężny i wydajny datagrid z funkcjami podobnymi do Excela i leniwym ładowaniem / zoptymalizowanym renderowaniem (dla milionów wierszy) z bogate funkcje edycji (licencja MIT). Jeszcze nie próbowałem w naszym projekcie, ale zrobię to wkrótce.
Świetnym źródłem do wyszukiwania takich rzeczy jest również http://react.rocks/ W tym przypadku pomocne jest wyszukiwanie tagów: http://react.rocks/tag/InfiniteScroll
źródło
Stałem przed podobnym wyzwaniem związanym z modelowaniem nieskończonego przewijania w jednym kierunku z niejednorodnymi wysokościami elementów, dlatego z mojego rozwiązania utworzyłem pakiet npm:
https://www.npmjs.com/package/react-variable-height-infinite-scroller
i demo: http://tnrich.github.io/react-variable-height-infinite-scroller/
Możesz sprawdzić kod źródłowy logiki, ale zasadniczo postępowałem zgodnie z przepisem @Vjeux przedstawionym w powyższej odpowiedzi. Nie zająłem się jeszcze przeskakiwaniem do konkretnego przedmiotu, ale mam nadzieję, że wkrótce to zaimplementuję.
Oto szczegóły tego, jak obecnie wygląda kod:
źródło