React-virtualized 动态高度列表呈现最初堆叠的所有内容
React-virtualized dynamic height list renders everything stacked initially
我正在尝试使用 react-virtualized 来虚拟化一个列表,其中某些行的高度不同,而且该列表占据了父级中的所有 space。我正在尝试使用 CellMeasurer、AutoSizer 和 List 组件来完成此操作。
我的包版本如下:
react: "16.8.6"
react-dom: "16.8.6"
react-virtualized: "^9.21.1"
import React, { PureComponent } from 'react';
import 'react-virtualized/styles.css';
import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';
import { CellMeasurer, CellMeasurerCache, List } from 'react-virtualized';
class Table extends PureComponent {
rowRenderer = ({ index, style, key }) => {
return (
<CellMeasurer
cache={this.cache}
columnIndex={0}
key={key}
parent={parent}
rowIndex={index}
>
<div style={style} key={key}>
content
</div>
</CellMeasurer>
);
}
cache = new CellMeasurerCache({
defaultHeight: 24,
fixedWidth: true,
});
renderAutoSizerContent = () => {
return this.RenderList;
}
RenderList = ({ height, width }) => {
return (<List
items={this.props.items}
width={width}
height={height}
rowCount={this.props.items.length}
rowHeight={this.cache.rowHeight}
rowRenderer={this.rowRenderer}
deferredMeasurementCache={this.cache}
/>
);
}
render() {
return (
<AutoSizer
items={ this.props.items}
>
{this.renderAutoSizerContent()}
</AutoSizer>
);
}
}
export default Table;
初始渲染后一切看起来像这样。由于某种原因,数组中每个元素的 top 属性都是 0:
滚动或触发重新渲染后,项目似乎获得了顶部 属性 和以下渲染。在实际代码中,我的一些元素具有高度差异,但高度似乎默认为我为 CellMeasurerCache 构造函数提供的 defaultHeight。
如何使每个元素的初始渲染具有顶部 属性,以及如何正确计算高度?我在此处显示的代码中做错了什么?
在您的 rowRenderer 组件中,您向 CellMeasurer 提供了 parent 属性,但 parent 未定义.
如文档中所写,您从 rowRenderer 获取父级:https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#rowrenderer
所以你的 rowRenderer 组件应该是:
rowRenderer = ({ index, style, key, parent }) => {
return (
<CellMeasurer
cache={this.cache}
columnIndex={0}
key={key}
parent={parent}
rowIndex={index}
>
<div style={style} key={key}>
{items[index]}
</div>
</CellMeasurer>
);
}
您还可以使用工作示例检查此代码沙箱:https://codesandbox.io/s/material-demo-yw1k8?fontsize=14
我正在尝试使用 react-virtualized 来虚拟化一个列表,其中某些行的高度不同,而且该列表占据了父级中的所有 space。我正在尝试使用 CellMeasurer、AutoSizer 和 List 组件来完成此操作。
我的包版本如下:
react: "16.8.6"
react-dom: "16.8.6"
react-virtualized: "^9.21.1"
import React, { PureComponent } from 'react';
import 'react-virtualized/styles.css';
import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';
import { CellMeasurer, CellMeasurerCache, List } from 'react-virtualized';
class Table extends PureComponent {
rowRenderer = ({ index, style, key }) => {
return (
<CellMeasurer
cache={this.cache}
columnIndex={0}
key={key}
parent={parent}
rowIndex={index}
>
<div style={style} key={key}>
content
</div>
</CellMeasurer>
);
}
cache = new CellMeasurerCache({
defaultHeight: 24,
fixedWidth: true,
});
renderAutoSizerContent = () => {
return this.RenderList;
}
RenderList = ({ height, width }) => {
return (<List
items={this.props.items}
width={width}
height={height}
rowCount={this.props.items.length}
rowHeight={this.cache.rowHeight}
rowRenderer={this.rowRenderer}
deferredMeasurementCache={this.cache}
/>
);
}
render() {
return (
<AutoSizer
items={ this.props.items}
>
{this.renderAutoSizerContent()}
</AutoSizer>
);
}
}
export default Table;
初始渲染后一切看起来像这样。由于某种原因,数组中每个元素的 top 属性都是 0:
滚动或触发重新渲染后,项目似乎获得了顶部 属性 和以下渲染。在实际代码中,我的一些元素具有高度差异,但高度似乎默认为我为 CellMeasurerCache 构造函数提供的 defaultHeight。
如何使每个元素的初始渲染具有顶部 属性,以及如何正确计算高度?我在此处显示的代码中做错了什么?
在您的 rowRenderer 组件中,您向 CellMeasurer 提供了 parent 属性,但 parent 未定义.
如文档中所写,您从 rowRenderer 获取父级:https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#rowrenderer
所以你的 rowRenderer 组件应该是:
rowRenderer = ({ index, style, key, parent }) => {
return (
<CellMeasurer
cache={this.cache}
columnIndex={0}
key={key}
parent={parent}
rowIndex={index}
>
<div style={style} key={key}>
{items[index]}
</div>
</CellMeasurer>
);
}
您还可以使用工作示例检查此代码沙箱:https://codesandbox.io/s/material-demo-yw1k8?fontsize=14