У меня есть компонент реакции, который отображает одномерный список элементов в виде сетки. Все элементы имеют одинаковую ширину и высоту и расположены в трех столбцах. Их может быть много, поэтому я решил дать волю React-Virtualized, используя компонент Masonry, который, кажется, был написан именно для этого варианта использования. Это работает хорошо, но с одной оговоркой: если элементы изменяют свою высоту, я не могу заставить Masonry это заметить.
Вот уменьшенный пример:
constructor(props) {
[...]
this.cellMeasurerCache = new CellMeasurerCache({
defaultHeight: this.state.height,
fixedWidth: true,
});
this.cellPositioner = createMasonryCellPositioner({
cellMeasurerCache: this.cellMeasurerCache,
columnCount: 3,
columnWidth: 250,
spacer: 20,
});
}
[...]
cellRenderer({ index, key, parent, style }) {
return (
<CellMeasurer
cache={this.cellMeasurerCache}
index={index}
key={key}
parent={parent}
>
<div style={style}>
[...]
</div>
</CellMeasurer>
);
}
resetMasonry() {
this.cellMeasurerCache.clearAll();
this.cellPositioner.reset({
cache: this.cellMeasurerCache,
columnCount: 3,
columnWidth: 250,
spacer: 20,
});
this.masonryRef.recomputeCellPositions();
}
render() {
return (
<AutoSizer>
{({ height, width }) =>
<Masonry
cellCount={this.state.list.length}
cellMeasurerCache={this.cellMeasurerCache}
cellPositioner={this.cellPositioner}
cellRenderer={this.cellRenderer}
height={height}
ref={this.setMasonryRef}
width={width}
/>
}
</AutoSizer>
);
}
resetMasonry
вызывается, когда состояние высоты компонента изменилось. Я культивировал текущий код из нескольких ответов stackoverflow и других ресурсов, даже просмотрел исходный код, но ничего не работает. Я заметил, что я не сообщаю cellMeasurerCache или чему-либо еще об изменении высоты, поэтому я действительно не должен ожидать, что это сработает, но, похоже, нет никакого способа получить эту информацию там, даже путем создания экземпляра новый CellMeasurerCache
.
Между прочим, если я изменю columnWidth в пределах cellPositioner.reset
, компонент Masonry обновится соответствующим образом, конечно же.
Кто-нибудь знает, чего мне не хватает, чтобы заставить его работать для изменения высоты? Спасибо!