2015-10-23 27 views
8

Mam dużą listę, powiedzmy 3k członków. Mam komponent, który renderuje tę listę i komponent dla każdego elementu listy. W zewnętrznym komponentem mamy kod tak:Wydajność przy podświetlaniu pozycji na liście przy użyciu React

const list = _.map(this.props.items, (item) => { 
    return <ListItem key={item.key} {...item} /> 
}); 

a potem w naszej JSX umieszczamy listę:

<div> 
    <h3>Check out my sweet list </h3> 
    { list } 
</div> 

Tu właśnie sęk: Chcę pokazać użytkownikowi po kliknięciu na elemencie że przedmiot został wybrany. Tak więc w moim komponencie ListItem mam kod, który w zależności od tego, czy dany element ma właściwość selected, podświetla się. Jak zatrzymać React przed ponownym utworzeniem całej listy, gdy zmieni się tylko wybrana właściwość pojedynczego elementu? Jestem pewien, że muszę jakoś zrestrukturyzować mój kod, ale nie jestem pewien, jaka struktura rozwiąże ten problem. Chętnie odpowiem na wszystkie pytania i dziękuję z góry!

Uwagi:

  • Nie mówię renderowania 3k pozycji na liście jest dobre, po prostu uwierzyć ten powinien być, co do zasady, możliwe do zrobienia z zareagować.
  • Lista nie jest dosłownie ponownie renderowana na rzeczywistej domenie, ale domena wirtualna wykonuje pracę polegającą na porównywaniu wszystkiego, co zajmuje dużo czasu.
+0

Nawet jeśli dostaniesz całą listę, wierzę, że reaguje ona na porównanie w wirtualnej domenie i tylko ponownie renderuje te wybrane zmienione, czy chcesz, aby ta domena wirtualna była porównywalna? – fuyushimoya

+0

Po prostu offtopic - dlaczego ciągle widzę, że "reaguje nie na wydajność z listą 1000 elementów" - jaki rodzaj UX wyświetla na raz 1000 elementów? O ile nie jest to rzadki przypadek, nie widzę powodu, aby nie używać wyszukiwania/filtrowania/paginacji/progresywnego ładowania/limitów, a jeśli lista członków rośnie, zawsze stanie się dysfunkcjonalna, jeśli wyświetlisz wszystko, co oznacza –

+0

@fuyushimoya tak, że wirtualna domena jest ma miejsce, więc to nie jest cała lista dosłownie ponownie renderowana na domenie, tylko ciekawa, czy istnieje sposób na uporządkowanie kodu, aby uniknąć tego wstępnego przetwarzania, ponieważ jest on uporządkowany na kilka sekund (i tak, tak, wiem, że to jest duży przykład i nie powinieneś renderować elementów 3k na liście). –

Odpowiedz

5

Okej, wymyśliłem to. Pomyślne wdrożenie shouldComponentUpdate dla każdego pojedynczego elementu powoduje ogromny wzrost wydajności. Nie udało mi się tego zrobić z prostego powodu.

shouldComponentUpdate(nextProps) { 
    return !_.isEqual(nextProps, this.props); 
} 

Jednak ... robiłem to na moim deklaracji poszczególnych elementów:

onClick={this.handleItemClick.bind(this, item.key)} 

co oznacza, że ​​this.props.onClick === nextProps.onClick zawsze return false, więc każdy pojedynczy element zawsze deklarują się jako wymagające być ponowny zwrot. Po wprowadzeniu niestandardowego czeku jest teraz niezwykle szybki!

Powiązane problemy