У меня почти такая же проблема, как у Facebook при рендеринге фида. Как только отрисовывается много постов, появляются проблемы с производительностью. После некоторых исследований я обнаружил, что react-virtualized — это круто, но у меня возникли проблемы с тем, чтобы заставить его работать для моего приложения.
Вот проблемы, с которыми я сталкиваюсь:
- Поскольку в каждое сообщение может быть встроен iframe или изображение, я запускаю обратный вызов
measure
изCellMeasurer
после загрузки этих элементов. Из-за этого некоторые элементы кажутся смещенными. Я пробовал делатьparent.measureAllRows()
иparent.recomputeRowHeights()
каждый раз, когда вызывается обратный вызовmeasure
, чтобы посмотреть, исправит ли он это, но это не так. - Каждый пост имеет расширяемый раздел, поэтому мне нужно пересчитать его высоту. Есть ли альтернатива, кроме отправки реквизита компоненту?
Это установка:
class VirtualPostList extends React.PureComponent {
constructor(props, context) {
super(props, context);
this._cache = new ReactVirtualized.CellMeasurerCache({
fixedWidth: true,
defaultHeight: 400
});
this.rowRenderer = this.rowRenderer.bind(this);
}
rowRenderer({index, isScrolling, key, parent, style}) {
return (
<ReactVirtualized.CellMeasurer
cache={this._cache}
columnIndex={0}
key={key}
parent={parent}
rowIndex={index}>
{({measure}) => (
<div key={key} style={style}>
<Post onLoad={measure}/>
</div>
)}
</ReactVirtualized.CellMeasurer>
)
}
componentDidUpdate(){
this.listComponent.recomputeRowHeights();
}
render() {
const cache = this._cache;
const rowCount = this.props.posts.length;
const _this = this;
return (
<ReactVirtualized.WindowScroller>
{({height, isScrolling, onChildScroll, scrollTop}) =>
<ReactVirtualized.AutoSizer disableHeight>
{({width}) =>
<ReactVirtualized.List
autoHeight
isScrolling={isScrolling}
height={height}
width={width}
rowCount={rowCount}
deferredMeasurementCache={cache}
rowHeight={cache.rowHeight}
rowRenderer={this.rowRenderer}
scrollTop={scrollTop}
onScroll={onChildScroll}
ref={(listComponent) => _this.listComponent = listComponent}
/>
}
</ReactVirtualized.AutoSizer>}
</ReactVirtualized.WindowScroller>
)
}
}
Пример перекрытия:
onLoad
не срабатывает слишком рано? Я был бы рад взглянуть на Plnkr, если вы создадите реплику. Это должно работать нормально. Я предполагаю, что есть какая-то проблема со временем. - person bvaughn   schedule 28.07.2017onLoad
при загрузке маленьких аватаров. Может быть, это оно. Хотя не уверен. - person Matías Hernán García   schedule 28.07.2017CellMeasurer
должен быть довольно оптимизирован для работы сGrid
. Не уверен, что могло бы замедлить работу, если бы вы активировали обратный вызов в нужное время. На виртуализированной демо-странице реакции я загружаю изображения вList
сCellMeasurer
и используюonLoad
для их измерения аналогичным образом, и, похоже, это работает довольно хорошо. - person bvaughn   schedule 29.07.2017measure
. Я прямо сейчас профилирую его, кажется, что он немного менее эффективен, чем другой вариант, но на данный момент избавляет от многих головных болей, и этого достаточно для моих требований :) - person Matías Hernán García   schedule 30.07.2017