Недавно я использовал react-virtualized
List
для отображения строк карточек изображений с фиксированной высотой и переменной шириной, и это отлично сработало.
Мой List
rowRenderer
использует массив строк элементов изображения карты. То есть массив массивов реагирующих компонентов, как JSX.
См. Мою последнюю функцию cardsRows
, чтобы узнать, как я строю строки на основе ширины элементов и ширины экрана.
Вот как это выглядит:
Надеюсь это поможет!
Некоторые фрагменты моего кода:
import {AutoSizer, List} from 'react-virtualized';
...
updateDimensions() {
this.setState({
screenWidth: window.innerWidth,
});
}
componentDidMount() {
window.addEventListener("resize", this.updateDimensions);
}
componentDidUpdate(prevProps, prevState) {
const props = this.props;
const state = this.state;
if (JSON.stringify(props.imageDocs) !== JSON.stringify(prevProps.imageDocs) || state.screenWidth !== prevState.screenWidth)
this.setState({
cardsRows: cardsRows(props, state.screenWidth),
});
}
rowRenderer({key, index, style, isScrolling}) {
if (!this.state.cardsRows.length)
return '';
return (
<div id={index} title={this.state.cardsRows[index].length} key={key} style={style}>
{this.state.cardsRows[index]}
</div>
);
}
...
render() {
return (
<div style={styles.subMain}>
<AutoSizer>
{({height, width}) => (<List height={height}
rowCount={this.state.cardsRows.length}
rowHeight={164}
rowRenderer={this.rowRenderer}
width={width}
overscanRowCount={2}
/>
)}
</AutoSizer>
</div>
);
}
...
const cardsRows = (props, screenWidth) => {
const rows = [];
let rowCards = [];
let rowWidth = 0;
const distanceBetweenCards = 15;
for (const imageDoc of props.imageDocs) {
const imageWidth = getWidth(imageDoc);
if (rowWidth + distanceBetweenCards * 2 + imageWidth <= screenWidth) {
rowCards.push(cardElement(imageDoc));
rowWidth += distanceBetweenCards + imageWidth;
}
else {
rows.push(rowCards);
rowCards = [];
rowWidth = distanceBetweenCards;
}
}
if (rowCards.length) {
rows.push(rowCards);
}
return rows;
};
const styles = {
subMain: {
position: 'absolute',
display: 'block',
top: 0,
right: 0,
left: 0,
bottom: 0,
}
};
person
stuart
schedule
22.01.2017
Grid
, а неComponent
.Grid
более эффективен и прост в использовании. Второй, который вы показываете, может бытьList
, но вычислить количество строк будет немного сложно. - person bvaughn   schedule 12.01.2017Collection
, а неComponent
? В любом случае, я понимаю, что вы оба говорите. Думаю, попробуюGrid
для первой коллекции. Для второй коллекции я использовал CassetteRocks / react-infinite-scroller. Когда у меня появится свободное время, я снова попробую реализовать вторую коллекцию с помощью React Virtualized. Потому что репо мне очень нравится! :) Спасибо вам обоим за ваш вклад. - person Jooooooooohn   schedule 13.01.2017