From e4452e3e575b57031de83259bbd403faa7cdce2a Mon Sep 17 00:00:00 2001 From: eug-vs Date: Fri, 14 Aug 2020 19:24:00 +0300 Subject: perf: greatly bost PollsList performance :rocket: Get rid of unnesessary re-renders of the whole list on scroll. --- src/components/PollsList/PollsList.tsx | 44 ++++++++++------------------------ 1 file changed, 13 insertions(+), 31 deletions(-) (limited to 'src/components/PollsList/PollsList.tsx') diff --git a/src/components/PollsList/PollsList.tsx b/src/components/PollsList/PollsList.tsx index c95bfde..62273ef 100644 --- a/src/components/PollsList/PollsList.tsx +++ b/src/components/PollsList/PollsList.tsx @@ -1,41 +1,23 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import { Poll } from 'which-types'; import { WindowScroller, AutoSizer, List } from 'react-virtualized'; -import PollCard from '../PollCard/PollCard'; - +import RenderItem from './RenderItem'; interface PropTypes { polls: Poll[]; mutate: (polls: Poll[], refetch: boolean) => void; } -interface RenderPropTypes { - index: number; - key: string; - style: React.CSSProperties; -} - - const PollsList: React.FC = ({ polls, mutate }) => { - const RenderItem: React.FC = ({ index, style, key }) => { - const poll = polls[index]; - - const setPoll = (newPoll: Poll) => { - const newPolls = [...polls]; - newPolls[index] = newPoll; - - // Force-update list-size so everything re-renders - mutate([], false); - mutate(newPolls, false); - }; - - return ( - // To re-render on list resize, add this info to key -
- -
- ); - }; + const rowRenderer = useCallback(({ index, style, key }) => ( + + ), [polls, mutate]); return ( @@ -56,11 +38,11 @@ const PollsList: React.FC = ({ polls, mutate }) => { onScroll={onChildScroll} rowCount={polls.length} rowHeight={550} - rowRenderer={RenderItem} + rowRenderer={rowRenderer} scrollTop={scrollTop} width={width} containerStyle={{ pointerEvents: 'auto' }} - overscanRowCount={1} + overscanRowCount={2} /> )} -- cgit v1.2.3