ドキュメントを読んだところ、これが現在 React Virtualized ライブラリでサポートされているようには見えません。
ドキュメントのどの部分があなたにこのような印象を与えたのか知りたいです. あなたのユースケースは、react-virtualized が十分に処理できるように思えます。:)
コンポーネントはCollection
近いようです
Collection
他の何かを意図しています。おそらく、私が最近行った会議の講演からのこれらのスライドは、それを少し明確にすることができます. 基本的にCollection
は、非線形データ (ガント チャート、Pinterest レイアウトなど) 用です。より柔軟ですが、パフォーマンスが犠牲になります。あなたのユースケースはList
. :)
更新された回答
とを使用List
しAutoSizer
てこれを実現できます。利用可能な幅とアイテムの高さを使用して行数を計算するだけです。複雑すぎません。:)
以下は Plunker の例で、ソースは次のとおりです。
const { AutoSizer, List } = ReactVirtualized
const ITEMS_COUNT = 100
const ITEM_SIZE = 100
// Render your list
ReactDOM.render(
<AutoSizer>
{({ height, width }) => {
const itemsPerRow = Math.floor(width / ITEM_SIZE);
const rowCount = Math.ceil(ITEMS_COUNT / itemsPerRow);
return (
<List
className='List'
width={width}
height={height}
rowCount={rowCount}
rowHeight={ITEM_SIZE}
rowRenderer={
({ index, key, style }) => {
const items = [];
const convertedIndex = index * itemsPerRow;
for (let i = convertedIndex; i < convertedIndex + itemsPerRow; i++) {
items.push(
<div
className='Item'
key={i}
>
Item {i}
</div>
)
}
return (
<div
className='Row'
key={key}
style={style}
>
{items}
</div>
)
}
}
/>
)
}}
</AutoSizer>,
document.getElementById('example')
)
最初の回答
多かれ少なかれ、私がすることは次のとおりです。
export default class Example extends Component {
static propTypes = {
list: PropTypes.instanceOf(Immutable.List).isRequired
}
constructor (props, context) {
super(props, context)
this._rowRenderer = this._rowRenderer.bind(this)
this._rowRendererAdapter = this._rowRendererAdapter.bind(this)
}
shouldComponentUpdate (nextProps, nextState) {
return shallowCompare(this, nextProps, nextState)
}
render () {
const { list } = this.props
return (
<AutoSizer>
{({ height, width }) => (
<CellMeasurer
cellRenderer={this._rowRendererAdapter}
columnCount={1}
rowCount={list.size}
width={width}
>
{({ getRowHeight }) => (
<List
height={height}
rowCount={list.size}
rowHeight={getRowHeight}
rowRenderer={this._rowRenderer}
width={width}
/>
)}
</CellMeasurer>
)}
</AutoSizer>
)
}
_getDatum (index) {
const { list } = this.props
return list.get(index % list.size)
}
_rowRenderer ({ index, key, style }) {
const datum = this._getDatum(index)
return (
<div
key={key}
style={style}
>
{datum.name /* Or whatever */}
</div>
)
}
_rowRendererAdapter ({ rowIndex, ...rest }) {
return this._rowRenderer({
index: rowIndex,
...rest
})
}
}