реагировать-виртуализированный бесконечный цикл исчезновения / повторного появления полосы прокрутки

В настоящее время я использую виртуализированную реакцию для отображения огромных списков. Когда я изменяю размер и достигаю определенной ширины, возникает точка, в которой полоса прокрутки бесконечно исчезает и появляется снова, даже если рассчитанная ширина остается прежней. Это может быть ошибка в библиотеке, виртуализированной на реагирование, но я пытаюсь найти способ ее обойти. Вот что у меня сейчас есть в моем методе рендеринга:

// The onResize is what I am currently focusing on
<AutoSizer disableHeight onResize={this.setDimensions}>
        {({ width }) => {
          return (
            <div id={id} style={{ width: this.state.containerWidth }}>
              <InfiniteLoader
                isRowLoaded={this.isRowLoaded}
                loadMoreRows={handleInfiniteLoad}
                rowCount={sheetsTotalCount} // all elements, not only the loaded
                threshold={3} // starts loading the new data within 3 rows from the bottom
                minimumBatchSize={3}
              >
                {({ onRowsRendered, registerChild }) => (
                  <WindowScroller scrollElement={scrollElement}>
                    {({ height, scrollTop }) => (
                      <List
                        autoHeight
                        height={height || defaultHeight}
                        ref={registerChild}
                        rowCount={this.state.numRows}
                        rowHeight={this.state.cardHeight + 2 * marginBetweenCards}
                        rowRenderer={this.rowRenderer} // renders the rows
                        scrollTop={scrollTop}
                        width={this.state.containerWidth}
                        onRowsRendered={onRowsRendered}
                        className="oh outline-none"
                      />
                    )}
                  </WindowScroller>
                )}
              </InfiniteLoader>
              {sheetsTotalCount > 0 &&
                sheetsAreLoading &&
                renderLoadingIndicator()}
            </div>
          );
        }}
      </AutoSizer>

При использовании свойства onResize я получаю бесконечную ошибку исчезновения / повторного появления, поскольку код пытается выполнить серию вычислений.

setDimensions = ({ width }) => {
    const { sheetList } = this.props;
    this.setState({
      containerWidth: width > 0 ? width : defaultWidth
    },() => { 
      this.setState({numCols: Math.max(Math.floor(this.state.containerWidth / baseThumbnailWidth), 1) }, () => {
        this.setState({numRows: Math.ceil(sheetList.size / this.state.numCols)}, () => {
          this.setState({cardWidth: Math.floor(this.state.containerWidth / this.state.numCols - 2 * marginBetweenCards)}, () => {
            this.setState({cardHeight: Math.round(this.state.cardWidth * thumbnailProportion)});
          });
        });
      });
    });
  }

Изменить: мне удалось решить свою проблему, уменьшив ширину определенных размеров окна. Я думаю, что это может быть проблема с реакцией-виртуализацией, и проблема, которая больше всего похожа на то, с чем я имел дело, была из проблемы, показанной на Wessel.


person Michael Gee    schedule 25.07.2020    source источник
comment
Вы не говорите, как вы реализовали rowRenderer, поэтому я не уверен, что это ответ, но вы убедились, что применили стиль из аргументов функции rowRenderer к возвращаемому элементу согласно github.com/bvaughn/react-virtualized/issues/?   -  person wessel    schedule 29.07.2020


Ответы (1)


Думаю, проблема в том, что вы вяжете так много setStates. И каждый раз, когда одно из ваших состояний обновляется, он снова отображает ваш список, и тот факт, что вы встраиваете его 5 раз, кажется опасным.

Нет ли возможности предварительно рассчитать все, а затем вызвать setState и обновить все свои свойства сразу? Я бы попробовал.

person Justsolarry    schedule 03.08.2020