以下是我的反应组件的cellSizeAndPositionGetter
和render
函数。当我调整屏幕大小时,我的屏幕布局不会改变,但我可以通过控制台确认width
和state.columnCount
(由cellSizeAndPositionGetter
使用)正在改变。如何使用新宽度和columnCount重新呈现react-virtualized Collection时进行更新?
是否可以在参数更改后触发Collection
更新(即width
)?或者我在这里做错了什么?
旁注:react-virtualized
List
确实更新宽度参数更改。
cellSizeAndPositionGetter({index}) {
const list = this.state.cardsList;
const columnCount = this.state.columnCount;
const columnPosition = index % (columnCount || 1);
const datum = list[index];
const height = datum.height;
const width = CELL_WIDTH;
const x = columnPosition * (GUTTER_SIZE + width);
const y = this._columnYMap[columnPosition] || 0;
this._columnYMap[columnPosition] = y + height + GUTTER_SIZE;
return ({
height,
width,
x,
y
});
}
...
render() {
return (
<div style={styles.subMain}>
<AutoSizer >
{({height, width}) => {
console.log(`width: ${width}`);
console.log(`col count: ${this.state.columnCount}`);
return (
<Collection
cellCount={this.state.cardsList.length}
cellRenderer={this.cellRenderer}
cellSizeAndPositionGetter={this.cellSizeAndPositionGetter}
height={height}
width={width}
overscanRowCount={1}
/>
);
}}
</AutoSizer>
</div>
);
}
UPDATE:(数小时后)
我发现了一个很缺憾工作各地去react-virtualize
Collection
更新之后的宽度参数更改。
当屏幕尺寸发生变化时,我将删除显示元素(图像)列表中的最后一个元素。起初我尝试清除列表,但这会导致明显的视觉副作用。现在,只有在我的显示器中最后的图像在调整屏幕大小时发生了奇怪的闪烁。
但它仍然会很高兴得到Collection
更新以下width
更改。 :)
这里是代码,似乎欺骗Collection
进行更新。关键部分是setState
的第三行,我删除了最后一个元素。
updateDimensions() {
this.setState({
screenWidth: window.innerWidth,
columnCount: Math.floor(window.innerWidth/(CELL_WIDTH + GUTTER_SIZE)),
cardsList: [...this.state.cardsList.slice(0, this.state.cardsList.length - 1)]
});
}
componentDidMount() {
...
window.addEventListener("resize", this.updateDimensions);
}